【问题标题】:Databinding - livedata with custom object not been fired数据绑定 - 未触发具有自定义对象的 livedata
【发布时间】:2019-06-13 01:24:48
【问题描述】:

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

例如:

我有一个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

抱歉,我给出了一个带有不同名称的示例变量。

【问题讨论】:

  • 你在FragmentBinding上给setLifecycleOwner()打电话了吗?
  • 是的,伙计。我是。
  • 请发布您的代码,包括onCreateView() 和观察者实现
  • 完成,我的片段代码
  • 好的。首先,您应该检查您的 BindingAdapter 逻辑。您有可能正在更新User.name,而不是User 本身。如果您只更新同一对象的字段LiveData 可能不会通知观察者。其次,使用viewLifecycleOwner 而不是this 用于LiveData 和数据绑定。

标签: android android-databinding android-livedata


【解决方案1】:

您的 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&lt;User&gt; 的双向绑定就没有任何意义。在这种情况下,您应该将其绑定到 MutableLiveData&lt;String&gt; 并手动更新视图模型中的 User 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2012-06-20
    • 2019-06-14
    相关资源
    最近更新 更多