指定为非null的Viewmodel参数返回为null



当我调用我的视图模型时,它会说我的参数返回为null,即使api调用有效,所以我想知道错误是发生在我的视图模式中吗?

我的视图模型

class HomeFragmentVM(
private val spManager: SPManager,
private val repository: Repository
) : AbstractViewModel() {
private val washingMachine = MutableLiveData<Post>()

fun getWashingMachines() {
launch {
repository.getPost()
.doOnSubscribe {
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
washingMachine.value = it
spManager.saveTitleID(it.title)
}, {
})
}
}
}

调试日志:

java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter title
at com.invenium.jlp_android_test.utils.SPManager.saveTitleID(Unknown Source:2)
at com.invenium.jlp_android_test.functionalities.Home.HomeFragmentVM$getWashingMachines$1.invoke$lambda-1(HomeFragmentVM.kt:32)
at com.invenium.jlp_android_test.functionalities.Home.HomeFragmentVM$getWashingMachines$1.lambda$UfyFFA37mNg1-E8x0CGZ3EyBoEY(Unknown Source:0)
at com.invenium.jlp_android_test.functionalities.Home.-$$Lambda$HomeFragmentVM$getWashingMachines$1$UfyFFA37mNg1-E8x0CGZ3EyBoEY.accept(Unknown Source:4)
at io.reactivex.internal.observers.ConsumerSingleObserver.onSuccess(ConsumerSingleObserver.java:63)
at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:81)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:119)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

型号:

data class Post(
@SerializedName("products")
var data: List<Data>,
@SerializedName("productId")
var productid: Int,
@SerializedName("title")
var title: String
)

由于某些模型尚未使用,因此该模型已被稍微缩短。

设置标题的默认值,如下所示:

  • @SerializedName("title"(var title:字符串="">

之后,如果您的问题得到解决,请检查为什么标题返回空

问题是title属性被定义为不可为null,但(显然(为null或不存在于JSON中。

除此之外,由于Kotlin编译器进行的检查,该应用程序正在崩溃。你可以在堆栈跟踪中看到它:

method kotlin.jvm.internal.Intrinsics.checkNotNullParameter

这是因为Gson(我假设您正在使用它,因为您有@SerializedName注释(使用Java反射并忽略Kotlin类型的可为null性,因此即使Kotlin属性被定义为不可为null,它也会将字段分配给null。

要解决崩溃,您必须将属性定义为可为null:

var title: String?

这样,编译器将强制您在将title传递给saveTitleID之前添加一个null检查。

尝试在模型中为null的标题

data class Post(
@SerializedName("products")
var data: List<Data>,
@SerializedName("productId")
var productid: Int,
@SerializedName("title")
var title: String? = null
)

最新更新