如何知道何时调用了`navController.popBackStack()`?

Posted

技术标签:

【中文标题】如何知道何时调用了`navController.popBackStack()`?【英文标题】:How to know when `navController.popBackStack()` was called? 【发布时间】:2020-11-25 08:49:21 【问题描述】:

我在代码中的某个位置弹出导航控制器上的后台堆栈 -

  navController.popBackStack()

将后续片段添加到后台堆栈的片段需要准确知道该片段何时弹出,以便触发之后的代码。

如何让第一个片段知道它?

我考虑过添加回调作为参数,但我怀疑这是一个好习惯。

【问题讨论】:

您是否考虑过在弹出的片段和活动之间共享 ViewModel?这可以工作 你有如何实现这样的例子吗? 【参考方案1】:

如果您使用Koin,您可以执行以下操作:

class MyActivity : AppCompatActivity()

// Lazy inject MyViewModel
val model : MySharedViewModelby sharedViewModel()

override fun onCreate() 
    super.onCreate()

model.isFragmentPopped.observe(this, Observe
    if(it)
            doSomething()
          
        


片段:

class MyFragment : Fragment()

// Lazy inject MyViewModel
val model : MySharedViewModel by sharedViewModel()

override fun onCreate() 
    super.onCreate()

    var fragmentX = model.isFragmentXPopped


fun backstackPopped
    model.fragmentPopped()
    navController.popBackStack()


视图模型:

var _isFragmentPopped = MutableLiveData<Boolean>(false)
val isFragmentPopped : LiveData<Boolean>
get = _isFragmentPopped

fun fragmentPopped()
    _isFragmentPopped.value = true

请记住,您应该使 sharedViewModel 尽可能小,因为它们在 Activity 被销毁之前不会被销毁。

【讨论】:

非常感谢您的评论。谢谢

以上是关于如何知道何时调用了`navController.popBackStack()`?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 jquery $.get ajax 调用何时完成?

如何使 libcurl C++ 调用超时和/或知道调用中何时发生超时

如何知道何时从控制台调用 JavaScript 函数? [复制]

异步队列,文件流结束如何知道两者何时完成

异步队列,文件流结束如何知道两者何时完成

我如何知道用户何时取消 HTML5 地理位置?