我在我的应用程序中使用 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
属性没有意义。字段是双向绑定的。
答案 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
是您延迟初始化的变量。