当我有一个自定义对象时,我在数据绑定和实时数据方面遇到了一些问题。
例如:
我有一个MutableLiveData
val user = MutableLiveData<User>()
,并且我正在使用两种方式进行数据绑定
@={viewModel.user.name}
但是我的观察者并没有在Fragment内部被解雇
viewModel.user.observer
。
当我在FragmentBinding
生成的类中放置一个断点时,可以看到setValue被调用,并且userLiveData的用户值和数据一起出现。
问题在于观察者未在Fragment内部触发。
有人知道我在那里做错了吗?
编辑1
下面是我的片段代码:
val infoPessoalViewModel: InfoPessoalViewModel by viewModel()
lateinit var bindingView: FragmentInfoPessoalBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
bindingView = DataBindingUtil.inflate(inflater, R.layout.fragment_info_pessoal, container, false)
return bindingView.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
bindingView.apply {
lifecycleOwner = this@InfoPessoalFragment
viewModel = infoPessoalViewModel
}
infoPessoalViewModel.user.observe(this, Observer { user ->
user.confirmEmail?.let {
//NOT FIRED HERE
Log.d("LiveData","Fired!")
}
})
}
编辑2
对不起,我提供了一个示例名称为diff的变量。
答案 0 :(得分:0)
您的BindingAdapter逻辑应该能够将EditText
输入转换为User
实例,反之亦然。假设User
实例看起来像这样:
User.kt
class User(val username: String)
然后,示例适配器应为:
MyBindingAdapters.kt
/**
* Convert EditText input into a User instance.
*/
@InverseBindingAdapter(attribute = "android:text")
fun getUser(view: EditText): User {
return User(view.text.toString())
}
/**
* Convert a User instance into EditText text
*/
@BindingAdapter("android:text")
fun setUser(view: EditText, newUser: User?) {
if (newUser?.username != view.text.toString()) {
view.setText(newUser?.username)
}
}
在布局文件中,绑定到userLiveData
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={viewModel.userLiveData}"/>
请注意适配器是双射的,这意味着一个User
与一个String
正好配对,反之亦然。如果User
类更复杂,则与MutableLiveData<User>
的双向绑定实际上没有任何意义。在这种情况下,您应该将其绑定到MutableLiveData<String>
并在视图模型中手动更新User
实例。