android - 如何初始化 MutableLiveData 对象的集合值?

标签 android kotlin android-jetpack

class Foo : ViewModel() {
   val bars: MutableLiveData<ArrayList<Bar>> = MutableLiveData()
     get() {
       if(field.value == null) {
         field.setValue(ArrayList()) // NullPointerException
       }
     }
}

class FooTest(){
   @Test fun itShouldNotBlowUp() {
     Foo() //nullPointerException

   }

}

我不明白如何初始化 MutableLiveData 对象的值。我试图通过 getter 和 init 懒惰地初始化它。堵塞。两种方法在设置值时都会抛出一个空指针。 bars但是不为空。

这是堆栈跟踪:
java.lang.NullPointerException
at android.arch.core.executor.DefaultTaskExecutor.isMainThread(DefaultTaskExecutor.java:58)
at android.arch.core.executor.ArchTaskExecutor.isMainThread(ArchTaskExecutor.java:116)
at android.arch.lifecycle.LiveData.assertMainThread(LiveData.java:434)
at android.arch.lifecycle.LiveData.setValue(LiveData.java:279)
at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
at org.Foo.<init>(Foo.kt:10)
at org.FooTest.ShouldNotBlowUp(FooTest.kt:3)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

如何初始化 ArrayList 并将其设置为 bars 的值?

最佳答案

也许原因是您试图在测试中运行它。您的示例在 DefaultTaskExecutor.isMainThread() 中失败,如下所示:

public boolean isMainThread() {
    return Looper.getMainLooper().getThread() == Thread.currentThread();
}

所以 Looper.getMainLooper() 在测试环境中返回 null。

而且,您是否尝试过通过“懒惰”委托(delegate)初始化属性?
val bars: MutableLiveData<List<Bar>> by lazy {
    MutableLiveData<List<Bar>>().apply {
        value = emptyList()
    }
}

在我的情况下效果很好并且感觉更惯用

关于android - 如何初始化 MutableLiveData 对象的集合值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53754358/

相关文章:

android - 从autocompletetextview onItemClickListener项目获取Firestore文档ID

android - 在 JetPack Compose 中手动重构所有 AndroidView

android - Jetpack Navigation 中从 RecyclerView 到 Detail Fragment 的共享元素转换

android - 返回后不调用onRestart方法

连接到设备时出现 Android BLE GATT_ERROR(133)

java - Android- 未找到 R.java 文件

android - 使用架构组件导航将数据从单个 Activity 传递到开始目标 fragment

android - Firebase 数据的更改不会更新

android - 如何使用 Maybe 运算符检查可空性

kotlin - 如何合并2个单独的流,如何从中缓冲填充的数据并在一段时间后进行订阅