数据绑定-具有自定义对象的实时数据未触发

时间:2019-06-11 22:24:35

标签: android android-databinding android-livedata

当我有一个自定义对象时,我在数据绑定和实时数据方面遇到了一些问题。

例如:

我有一个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的变量。

1 个答案:

答案 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实例。