我有一个设置,其中一个活动包含两个片段(a,B),B有一个包含3个片段(B1,B2,B3)的ViewPager
在活动(ViewModel)中,我从房间中观察模型(Model
),并将结果发布到本地共享流.
val mSharedFlow = MutableSharedFlow<Model>` that I publish the model updates to:
...
viewModelScope.launch { repo.observeModel().collect(sharedFlow) }
片段A和B(视图模型)可以通过(父)fun getModelFlow(): Flow<Model>
访问sharedFlow
viewModelScope.launch {
parent.getModelFlow().collect { model -> doStuff(model) }
}
但是,问题在于嵌套片段(B1等)
我在获取流(即SharedFlow(作为活动视图模型中的流))方面没有问题;但B1中的collect
没有任何作用.
- 为什么我不能从嵌套B1中的共享流中收集数据?(A和B工作正常时)
- 我是否已经没有考虑一些流量规则了?额外
launch{}'es
,其他withContexts(Some?)
,flowOn
,launchIn
等.?
(流的提供不是问题.即使我创建了中间流,或者将sharedFlow放在kotlin Singleton对象中,我仍然有同样的问题)
=== EDIT ===
我被要求添加更多信息,不幸的是(尽管如此),我无法粘贴实际的代码,因为它只会显得冗长和陌生(见我下面的 comments ).但这里有一些psuedo代码应该是等效的.
下面是您可以看到的一个说明:Activity、FragmentA、FragmentB、FragmentB1(等)都同时运行-但一次只能看到A和B中的一个.
class TheActivity {
fun onCreate() {
setupFragments()
}
/** Two fragments active at the same time,
but only one FrameLayout is visible at one time */
private fun setupFragments() {
val a = FragmentA.newInstance()
val b = FragmentB.newInstance()
supportFragmentManager.commit {
add(R.id.fragment_holder_a, a)
add(R.id.fragment_holder_b, b)
}
}
}
class ActivityViewModel {
val activityModelFlow = MutableSharedFlow<Model>()
fun start() {
viewModelScope.launch {
getRoomFlow(id).collect(activityModelFlow)
}
}
}
class FragmentA { // Not very interesting
val viewModel: ViewModelA
}
class ViewModelA {
fun start() {
viewModelScope.launch {
parentViewModel.activityModelFlow.collect { model ->
log("A model: $model")
}
}
}
}
class FragmentB {
val viewModel: ViewModelB
val viewPagerAdapter = object : PagesAdapter.Pages {
override val count: Int = 1
override fun title(position: Int): String = "B1"
override fun render(position: Int): Fragment = FragmentB1.newInstance()
}
}
class ViewModelB {
val bModelFlow: Flow<Model> get() = parentViewModel.activityModelFlow
fun start() {
viewModelScope.launch {
parentViewModel.activityModelFlow.collect { model ->
log("B model: $model")
}
}
}
}
class Fragment B1 {
val viewModel: ViewModelB1
}
class ViewModelB1 {
fun start() {
viewModelScope.launch {
// in essence:
// - ViewModelB.bModelFlow ->
// - ActivityViewModel.modelFlow
parentViewModel.bModelFlow.collect { model ->
log("B1 model: $model")
}
}
}
}
因此,获取parentViewModel、DI、片段创建等所有连接都工作得很好.但是B1 model: $model
从来没有叫过!为什么?