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

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

  navController.popBackStack()

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

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

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

【问题讨论】:

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

标签: android android-navigation fragment-backstack


【解决方案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 被销毁之前不会被销毁。

【讨论】:

  • 非常感谢您的评论。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2010-11-05
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多