【发布时间】:2021-11-23 06:40:34
【问题描述】:
我的目标是在片段堆栈中只允许同一对话框片段的一个实例。
当前触发条件来自 SharedFlow,并且可以在值之间以7ms 的频率触发。
这是我尝试过的:
- 将代码放在
synchronized块中 - 通过调用
fm.findFragmentByTag检查现有片段是否在堆栈中
但是,这两个条件都不足以阻止fragment多次添加到fragmentManager中。
我尝试使用dialogFragment.showNow(fm, tag),但它不稳定且崩溃
感谢任何帮助。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel.someSharedFlow
.flowWithLifecycle(viewLifecycleOwner.lifecycle)
.onEach { showMyFragmentDialog() }
.launchIn(viewLifecycleOwner.lifecycleScope)
}
private fun showMyFragmentDialog() {
synchronized(childFragmentManager) {
if (childFragmentManager.findFragmentByTag(MyFragment.TAG) == null) {
MyFragment.newInstance(fuelTypes)
.show(childFragmentManager, MyFragment.TAG)
}
}
}
【问题讨论】:
标签: android race-condition android-dialogfragment fragmentmanager kotlin-sharedflow