【问题标题】:Viewmodel Parameter specified as non-null comes back as null指定为非空的 Viewmodel 参数返回为空
【发布时间】:2022-09-27 10:55:00
【问题描述】:

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

该模型已被缩短为一些尚未使用的模型。

  • 也请分享模型
  • @Jaymin 我现在添加了它:)
  • 使用可为空的标题参数初始化或声明所有参数可为空。它将解决您的问题。
  • 我是否在视图模型中将其初始化为可为空? @Jaymin

标签: android kotlin debugging rx-java


【解决方案1】:

像这样设置标题的默认值:

  • @SerializedName("标题") var 标题:字符串 = ""

之后,如果你的问题解决了,检查为什么title返回null

【讨论】:

  • 这不起作用,因为 Gson 在通过反射实例化对象时忽略了它。
  • 是的,这不起作用
  • 如果让标题为空怎么办?
【解决方案2】:

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

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

method kotlin.jvm.internal.Intrinsics.checkNotNullParameter

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

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

var title: String?

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

【讨论】:

    【解决方案3】:

    尝试在模型中为空标题

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

    )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 2020-05-06
      • 2021-12-09
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多