gpt4 book ai didi

android - 共享 ViewModel 中的 hasActiveObservers 和 hasObservers false

转载 作者:行者123 更新时间:2023-12-02 13:44:51 29 4
gpt4 key购买 nike

我正在尝试使用共享 ViewModel 在两个 fragment 和 ViewPager2 之间进行通信,如下所示:

共享 View 模型

val viewPagerFragment = MutableLiveData<Int>()

init {
viewPagerFragment.value = -1
}

fun displayedFragment(fragmentIndex: Int){
viewPagerFragment.value = fragmentIndex
}

fun doSomethingForFragmentA(){
//
}

fun doSomethingForFragmentB(){
//
}

fragment A
override fun onResume() {
super.onResume()
sharedViewModel.displayedFragment(0)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedViewModel = ViewModelProvider(this).get(SharedViewModel::class.java)
}

fragment B
override fun onResume() {
super.onResume()
sharedViewModel.displayedFragment(1)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedViewModel = ViewModelProvider(this).get(SharedViewModel::class.java)
}

ViewPager2
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)

sharedViewModel.viewPagerFragment.observe(this, Observer {
when (it) {
0 -> sharedViewModel.doSomethingForFragmentA(it)
1 -> sharedViewModel.doSomethingForFragmentB(it)
}
})

}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedViewModel = ViewModelProvider(this).get(SharedViewModel::class.java)
}

在 ViewPager2 中第一次调用 onActivityCreated 期间,LiveData Observer 做出正确 react 。但是,hasActiveObservers 和 hasObservers 在共享 ViewModel 中都显示为 false。
当我从 FragmentA 切换到 FragmentB 时,FragmentB 在 onResume() 中正确更新 LiveData。这次 ViewPager2 中的 Observer 没有对更改使用react,并且 hasActiveObservers 和 hasObservers 仍然为 false。

值得一提的是,如果我将观察者从 ViewPager 移动到 FragmentA 和 FragmentB 一切正常。

唯一想到的是 ViewPager 有不同的主机 Activity 。

最佳答案

我设法使用 channel 解决了这个问题。不完全是我想要的,但它有效。我仍然希望有一个原始问题的解决方案。

应用容器

class AppContainer {
val currentViewPagerFragmentChannel = Channel<Int>()
}

基础应用
class BaseApplication : Application(){

val appContainer = AppContainer()
}

fragment A
override fun onResume() {
super.onResume()
val app = activity?.application as BaseApplication


GlobalScope.launch {
app.appContainer.currentViewPagerFragmentChannel.send(0)
}
}

fragment B
override fun onResume() {
super.onResume()
val app = activity?.application as BaseApplication

// Send an Integer
GlobalScope.launch {
app.appContainer.currentViewPagerFragmentChannel.send(1)
}
}

浏览器
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

launch {
val app = activity?.application as BaseApplication
val ch = app.appContainer.currentViewPagerFragmentChannel

if (!ch.isClosedForSend){
for (value in ch){
when (value) {
// FragmentA is displayed
0 -> sharedViewModel.doSomethingForFragmentA(value)
// FragmentB is displayed
1 -> sharedViewModel.doSomethingForFragmentB(value)
}
}
}
}
}

关于android - 共享 ViewModel 中的 hasActiveObservers 和 hasObservers false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59743521/

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