视图模型的 Kotlin 不支持 2 路数据绑定

时间:2021-06-16 13:01:04

标签: android kotlin mvvm

我在我的应用程序中使用 Android MVVM 模式和双向数据绑定。我有一个简单的表单,其中包含一些 MutableLiveData 字符串,然后是一个布尔值 MediatorLiveData,用于检查是否所有字段都已填充并启用或禁用按钮:

var name = MutableLiveData<String>()
var id = MutableLiveData<String>()
...
var isValid = MediatorLiveData<Boolean>()

我当然要将源添加到 MediatorLiveData

我的问题是我在片段中像这样初始化视图模型:

private val viewModel: StudentViewModel by viewModels()

而且由于我没有在片段代码中调用视图模型,所以这不起作用:

<layout>
<data>
<variable name="viewModel" type="com.example.app.viewmodels.StudentViewModel"/>
</data>
...
<FloatingActionButton ...
android:enabled="@{viewModel.isValid}"

在我使用 Java 并且这有效之前,但我切换到 Kotlin 并且我不想让 viewModel 为空并将其初始化 onCreate。这不应该是开箱即用的还是我做错了什么?

我的 StudentViewModel init 方法没有被调用,MediatorLiveData 的验证方法也没有被调用。当然,按钮只是单向绑定,因为双向绑定对按钮的 enabled 属性没有意义。字段是双向绑定的。

1 个答案:

答案 0 :(得分:1)

您需要分配 viewModel 的生命周期所有者:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val binding = YourBinding.bind(view)
        binding.apply {
            viewModel = mViewModel
            lifecycleOwner = viewLifecycleOwner
        }
    }

其中 mViewModel 是您延迟初始化的变量。