android - 当我从一个片段返回到另一个片段时,我的观察者总是在开火
问题描述
我正在使用导航组件,我有Fragment A和Fragment B,从Fragment A我用安全的 args向Fragment B发送一个对象并导航到它。
override fun onSelectableItemClick(position:Int,product:Product) {
val action = StoreFragmentDirections.actionNavigationStoreToOptionsSelectFragment(product,position)
findNavController().navigate(action)
}
现在,在我的Fragment B中的一些逻辑之后,我想再次将该数据传递给Fragment A,我使用
btn_add_to_cart.setOnClickListener {button ->
findNavController().previousBackStackEntry?.savedStateHandle?.set("optionList",Pair(result,product_position))
findNavController().popBackStack()
}
然后在Fragment A中,我赶上了这些数据
findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Pair<MutableList<ProductOptions>,Int>>("optionList")
?.observe(viewLifecycleOwner, Observer {
storeAdapter.updateProductOptions(it.second,it.first)
})
现在,这工作正常,但是如果我从Fragment A转到Fragment B并按下后退按钮,上面的观察者会再次触发复制我当前的数据,有没有办法在我只按下Fragmentbtn_add_to_cart
中的按钮时触发这个观察者乙?
解决方案
你使用这个扩展:
fun <T> Fragment.getResult(key: String = "key") =
findNavController().currentBackStackEntry?.savedStateHandle?.get<T>(key)
fun <T> Fragment.getResultLiveData(key: String = "key"): MutableLiveData<T>? {
viewLifecycleOwner.lifecycle.addObserver(LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_DESTROY) {
findNavController().previousBackStackEntry?.savedStateHandle?.remove<T>(key)
}
})
return findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<T>(key)
}
fun <T> Fragment.setResult(key: String = "key", result: T) {
findNavController().previousBackStackEntry?.savedStateHandle?.set(key, result)
}
例子:
片段A -> 片段B
Fragment B需要设置TestModel.class的结果
ResultTestModel.class
data class ResultTestModel(val id:String?, val name:String?)
片段 A:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// ...
getNavigationResultLiveData<PassengerFragmentResultNavigationModel>(
"UNIQUE_KEY")?.observe(viewLifecycleOwner) { result ->
Log.i("-->","${result.id} and ${result.name}")
}
//...
}
Fragment B:设置数据并调用popBackStack。
ResultTestModel(id = "xyz", name = "Rasoul")
setNavigationResult(key = "UNIQUE_KEY", result = resultNavigation)
findNavController().popBackStack()
推荐阅读
- java - 通过 REST 调用将多达 100 万条记录导出到 Excel 工作表的最佳方法是什么?
- c++ - 有没有办法在 C++ 中覆盖 Windows 上的物理键状态?
- ios - 如何在 ios10 中从 WKWebView 获取/存储 cookie?
- c - 动态内存分配硬故障问题
- ruby-on-rails - 带有子域的 Rails 应用程序中的动作电缆 - 公寓 gem 不工作
- swiftui - 用于导航的 SwiftUI PencilKit 协调器
- python - ttributeError:类型对象''没有属性'get_extra_actions'
- javascript - 在 Reactjs 中检测复杂对象状态变化的最简单方法是什么
- c# - 使用 Scrutor 自动进行依赖注入
- flutter - 是否有任何文本编辑器我也可以在 Flutter 的文本中间插入图像?