0

我的目标是在片段堆栈中只允许同一对话框片段的一个实例。

当前触发条件来自 SharedFlow 并且可以7ms在值之间多次触发。

这是我尝试过的:

  1. 将代码放在一个synchronized块中
  2. 通过调用检查现有片段是否在堆栈中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)
    }
  }
}

4

1 回答 1

0

暂时使用协程。不理想,但至少它正在工作。

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)
  }
}
于 2021-11-23T07:04:12.680 回答