简体   繁体   English

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

[英]How to know when `navController.popBackStack()` was called?

I am popping the backstack on my nav controller on some point in my code -我在我的代码中的某个点弹出我的导航 controller 上的后台堆栈 -

  navController.popBackStack()

The fragment that added that following fragment to the backstack needs to know exactly when that one was popped in order to trigger code following that.将后续片段添加到后台堆栈的片段需要准确知道该片段何时弹出,以便触发其后的代码。

How do I make the first fragment know about it?我如何让第一个片段知道它?

I thought about adding a callback as an argument but I doubt it's a good practice.我考虑过添加回调作为参数,但我怀疑这是一个好习惯。

If you use Koin you can do something like:如果您使用Koin ,您可以执行以下操作:

class MyActivity : AppCompatActivity(){

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

override fun onCreate() {
    super.onCreate()

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

Fragment:分段:

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()
}
}

ViewModel:视图模型:

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

fun fragmentPopped(){
    _isFragmentPopped.value = true
}

Keep in mind that you should keep sharedViewModels as small as possible as they do not get destroyed until the activity is destroyed.请记住,您应该使 sharedViewModel 尽可能小,因为它们在 Activity 被销毁之前不会被销毁。

we can create observer for return values from second fragment using popBackStack()我们可以使用 popBackStack() 为第二个片段的返回值创建观察者

In firstFragment use this for observer:-在 firstFragment 中,将其用于观察者:-

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val navController = findNavController()
    navController.currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")
        ?.observe(viewLifecycleOwner) {
          
        }
}

In secondFragment use this code在 secondFragment 中使用此代码

val navController = findNavController()
    navController.previousBackStackEntry?.savedStateHandle?.set("key", "you press back button")
    navController.popBackStack()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM