我的目标是在片段堆栈中只允许同一对话框片段的一个实例。
当前触发条件来自SharedFlow,并且可以与值之间的7ms
一样频繁地触发。
以下是我尝试过的:
- 将代码放置在
synchronized
块中 - 通过调用
fm.findFragmentByTag
检查堆栈中是否存在现有片段
但是,这两个条件都不足以阻止片段多次添加到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)
}
}
}
目前已使用协同程序解决。不理想,但至少它起作用了。
private var myLaunchJob: Job? = null
private fun showMyFragmentDialog() {
if (myLaunchJob?.isActive == true) return
myLaunchJob = viewLifecycleOwner.lifecycleScope.launch {
if (childFragmentManager.findFragmentByTag(MyFragment.TAG) == null) {
MyFragment.newInstance(fuelTypes)
.show(childFragmentManager, MyFragment.TAG)
}
// Act as debouncer
delay(1000)
}
}