到目前为止,我仅使用导航组件即可成功导航到对话框并返回。问题是,我必须在对话框中执行一些操作并将结果返回到调用对话框的片段。
一种方法是使用共享视图模型。但为此我必须使用 .of(activity) ,这会让我的应用程序有一个单例占用内存,即使我不再需要它。
另一种方法是重写 show(fragmentManager, id) 方法,访问片段管理器,并从中访问上一个片段,然后将其设置为目标片段。我之前使用过 targetFragment 方法来实现回调接口,因此我的对话框可以通知 targetFragment 有关结果的信息。但在导航组件方法中,它感觉很糟糕,并且可能会在某个时刻停止工作。
还有其他方法可以做我想做的事吗?也许有办法解决第一种方法的问题?
感谢@NataTse 以及官方文档 https://developer.android.com/guide/navigation/navigation-programmatic#additional_considerations,我想出了扩展,以便希望编写更少的样板代码:
fun <T>Fragment.setNavigationResult(key: String, value: T) {
findNavController().previousBackStackEntry?.savedStateHandle?.set(
key,
value
)
}
fun <T>Fragment.getNavigationResult(@IdRes id: Int, key: String, onResult: (result: T) -> Unit) {
val navBackStackEntry = findNavController().getBackStackEntry(id)
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME
&& navBackStackEntry.savedStateHandle.contains(key)
) {
val result = navBackStackEntry.savedStateHandle.get<T>(key)
result?.let(onResult)
navBackStackEntry.savedStateHandle.remove<T>(key)
}
}
navBackStackEntry.lifecycle.addObserver(observer)
viewLifecycleOwner.lifecycle.addObserver(LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_DESTROY) {
navBackStackEntry.lifecycle.removeObserver(observer)
}
})
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)