gpt4 book ai didi

android - 有一个类实现多个观察者

转载 作者:行者123 更新时间:2023-11-29 23:47:11 25 4
gpt4 key购买 nike

我实现了一个最初实现了 android.arch.lifecycle.Observer 的 Fragment,我想开始观察其他一些实时数据,但不能。我从这个开始:

class MyFragment : BaseFragment(), Observer<FragmentData> {
lateinit var viewModel: MyViewModel

override fun onActivityCreated(savedInstanceState: Bundle?) {
viewModel.fragmentData.observe(this, this)
}

override fun onChanged(data: FragmentData?) {
activity?.title = getTitleFromData(data)
}
}

如果我像这样更新类以包含其他可观察数据:

class MyFragment : BaseFragment(), Observer<FragmentData>, Observer<OtherData> {
lateinit var viewModel: MyViewModel

override fun onActivityCreated(savedInstanceState: Bundle?) {
viewModel.fragmentData.observe(this, this)
}

override fun onChanged(otherData: OtherData) {
// update UI from otherData
}

override fun onChanged(data: FragmentData?) {
activity?.title = getTitleFromData(data)
}
}

我得到一个错误:

Type parameter T of 'Observer' has inconsistent values: FragmentData, OtherData A supertype appears twice

我想要一些帮助来理解为什么编译器无法辨别类型之间的差异并想知道最佳替代模式。

是这样的吗?

viewModel.fragmentData.observe(this, fragmentDataObserver)

private val fragmentDataObserver = Observer<Fragmentdata> {
activity?.title = getTitleFromData(it)
}

最佳答案

你可以尝试像这样实现一个通用的 Observer 接口(interface):

class MyFragment : BaseFragment(), Observer<Any> {...} 

然后在 onChanged 方法上使用

override fun onChanged(any: Any?) {
when:
any is isOtherData -> Do OtherData things
any is FragmentData -> Do FragmentData things
}

第二种解决方法是创建 OtherData 和 FragmentData 的父类,FatherInterface 只是一个没有任何内容的接口(interface):

interface OtherData: FatherInterface{}...
interface FragmentData : FatherInterface{}...

然后你可以做

class MyFragment : BaseFragment(), Observer<FatherInterface>{}...

override fun onChanged(fatherInterface: FatherInterface?) {
when{
fatherInterface is OtherData -> ...
fatherInterface is FragmentData -> ...
}
// update UI from otherData
}

关于android - 有一个类实现多个观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51226755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com