【问题标题】:How to hide DialogFragment from showing again when moving between fragments android kotlin在片段android kotlin之间移动时如何隐藏DialogFragment再次显示
【发布时间】:2023-01-28 05:45:12
【问题描述】:

我有两个Fragments,让它成为Fragment AFragment B。在Fragment A中,我使用viewModel.items.collect {}从数据库中获取数据。在collect {} 中,用户看到了DialogFragment。问题是,当我转到Fragment A 时,我看到了这个对话框,然后转到Fragment B,然后返回Fragment A 并再次看到这个对话框,尽管这不是一个好消息。是否有可能以某种方式使它从Fragment B返回到Fragment A时不显示此对话框?

viewLifecycleOwner.lifecycleScope.launch {
    viewModel.items.collect { 
        MyDialog().show(childFragmentManager, MyDialog.TAG)
    }
}

【问题讨论】:

  • 您在哪种片段方法中添加了此代码?
  • @jayeshgurudayalani 在 onViewCreated()
  • 您可以尝试将此代码与您的视图模型初始化代码一起移动到片段的onCreate
  • @jayeshgurudayalani 是的,我尝试这样做,但应用程序崩溃并出现错误:当 getView() 为 null 时无法访问片段视图的 LifecycleOwner,即在 onCreateView() 之前或 onDestroyView() 之后
  • @jayeshgurudayalani 使用 viewLifecycleOwner 对我来说非常重要是有原因的——我的对话框不会立即调用,而是在特定的计时器上调用。我可以打开 Fragment A,然后打开 Fragment B,此时计时器到期并且应用程序崩溃,因为在错误的片段中调用了对话框。

标签: android kotlin android-dialogfragment


【解决方案1】:

我怀疑您的视图模型的属性项是 StateFlow 的类型。如果是这样,您应该更改为 SharedFlow。 StateFlow 会记住最后发出的值并为所有新订阅者发出它,因此当您开始收集时,您会得到一个触发对话的事件,但当您返回该片段时,再次调用收集并再次触发对话。默认情况下,SharedFlow 不会重复最后一个值,是一次性事件的最佳选择。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多