debugging 指定为非空的Viewmodel参数返回为空

8ehkhllq  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(117)

当我调用我的视图模型时,它说我的参数返回为空,即使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
)

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

k4ymrczo

k4ymrczo1#

按如下方式设置标题的默认值:

  • @序列化名称(“title”)变量标题:字符串=“”

之后,如果问题解决了,请检查title返回null的原因

ddhy6vgd

ddhy6vgd2#

问题是title属性被定义为不可为空,但(显然)为空或在JSON中不存在。
除此之外,应用程序崩溃的原因是Kotlin编译器进行的检查。你可以在堆栈跟踪中看到:

method kotlin.jvm.internal.Intrinsics.checkNotNullParameter

这是因为Gson(我假设您使用它,因为您有@SerializedName注解)使用Java反射并忽略了Kotlin类型的可空性,因此即使Kotlin属性被定义为不可空,它也会将字段赋为null。
要解决崩溃问题,您必须将属性定义为可空:

var title: String?

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

4ioopgfo

4ioopgfo3#

尝试在模型中使标题为空

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

相关问题