viewModels 的 Kotlin 无法使用 2 种方式的数据绑定

Kotlin by viewModels not working with 2 way data binding

我在我的应用程序中使用 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 属性上没有意义。这些字段是双向绑定的。

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

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

其中mViewModel是你懒初始化的变量。