【问题标题】:MutableLiveData with initial value具有初始值的 MutableLiveData
【发布时间】:2018-12-20 15:44:33
【问题描述】:

如何使用初始值初始化 MutableLiveData? 我正在寻找类似的东西:

val text = MutableLiveData<String>("initial value")

【问题讨论】:

    标签: android kotlin android-livedata


    【解决方案1】:

    MutableLiveData 已更新,现在它有一个接受初始值的构造函数:)

    据我所知,从这个版本开始可以使用构造函数:

    implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'

    很遗憾,他们没有更新 MediatorLiveData 以反映这一点。


    2.1.0 is finally stable,所以现在您实际上可以在documentation 中看到新的构造函数。

    【讨论】:

    • 这仍然正确吗?查看文档,我没有看到接受任何参数的公共构造函数:developer.android.com/reference/android/arch/lifecycle/…
    • @Noel 此更改未包含在稳定版本中,这就是您看不到它的原因。如果添加依赖项并打开类,您将看到新的构造函数。
    • 我认为这不再有效。 2.1.0-alpha01 版本对我来说没有给我另一个构造函数
    • @KlitosG。 2.1.0 is now finally stable,所以您现在实际上可以在文档中看到构造函数:developer.android.com/reference/androidx/lifecycle/…
    • @_Static_assert 不,但是有一个名为 NonNullableMutableLiveData 的 lint 检查(实际上在 latest release 的修复中提到过),而且自己写一个也不是很难:``` class NonNullableLiveData(initialValue: T) : MutableLiveData(initialValue) { override fun getValue(): T = super.getValue()!! } ```
    【解决方案2】:

    您可以创建一个方便的Extension Function 来为您进行初始化。

    fun <T : Any?> MutableLiveData<T>.default(initialValue: T) = apply { setValue(initialValue) }
    
    val liveData = MutableLiveData<String>().default("Initial value!")
    

    【讨论】:

    • 你也可以创建一个半构造函数fun &lt;T: Any?&gt; MutableLiveData&lt;T&gt;(initialValue: T) = MutableLiveData().apply { postValue(initialValue) },让它更方便(当你确定这个方法只会从主线程调用时使用setValue
    • 我使用这个扩展函数有一段时间了,今天我把它改成了fun &lt;T : Any?, LD : MutableLiveData&lt;T&gt;&gt; LD.default(initialValue: T) = apply { setValue(initialValue) },让它可以在任何扩展MutableLiveData的类上使用,例如MediatorLiveData.
    【解决方案3】:

    我终于意识到我可以使用

    val text = MutableLiveData&lt;String&gt;().apply { postValue("initial value")}

    (在后台线程使用时需要postValue,否则从主线程使用时您可以安全地使用value = "initial value"

    【讨论】:

    • 您可以在 ViewModel 中使用 setValue。
    • 这与设置初始值不同。如果您从工作线程执行此操作,则可以轻松创建竞争条件。不能保证在 postValue(...) 之后立即读取值,因为 setValue(...) 将在不同的线程上运行
    【解决方案4】:

    虽然这是一个 Kotlin 问题,但如果我也为此提供 Java 版本可能会有所帮助。

    在使用androidx 依赖时:

    implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
    

    使用构造函数初始化MutableLiveData,如下所示。

    new MutableLiveData<>("Initial value");
    

    使用android 依赖时:

    implementation 'android.arch.lifecycle:viewmodel:1.1.1'
    

    如下初始化。

    MutableLiveData<String> text = MutableLiveData<String>();
    text.setValue("Initial value");
    

    androidx 依赖项确实有一个构造函数,该构造函数接受一个值来初始化您的LiveData。但是,如果您使用 android 依赖项,您将无法使用构造函数进行初始化。

    【讨论】:

      【解决方案5】:

      你可以像这样创建一个扩展构造函数(糖把戏):

      fun <T : Any?> MutableLiveData(defaultValue: T) = MutableLiveData<T>().apply { setValue(defaultValue) }
      

      使用:

      var defaultValue: MutableLiveData<String> = MutableLiveData("Default value")
      

      【讨论】:

        【解决方案6】:

        也是这样..

            val data = MutableLiveData<String>()
            data.value = "data"
            val text = MutableLiveData<String>().apply {
                "apply"
            }
            Log.d("Data",text.value)
        

        【讨论】:

          【解决方案7】:

          如果您希望在 MutableLiveData&lt;T&gt; 中传递一些默认值,我有一个更好的解决方案如果您使用的是 kotlin,那么有一个名为 ObservableProperty&lt;T&gt;class 可以帮助您传递 MutableLiveData 的默认值。这里是我的实现。

          val nameLiveData = MutableLiveData<String>()
          var name: String by Delegates.observable("") { _, _, newValue ->
              nameLiveData.postValue(newValue)
          }
          

          在您的ActivityFragment 中观察此属性。

          viewModel.nameLiveData.observe(this, Observer {
                  //Your logic goes here
              })
          

          您所要做的只是更改值name = "Joe",它将发布在您的 LiveData 中

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-08
            • 2021-09-05
            相关资源
            最近更新 更多