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
是你懒初始化的变量。
我在我的应用程序中使用 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
是你懒初始化的变量。