当我从一个片段返回到另一个片段时,我的观察者总是在发射 [英] My observer is always firing when I come back from one fragment to another

查看:29
本文介绍了当我从一个片段返回到另一个片段时,我的观察者总是在发射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用导航组件,我有 Fragment AFragment B,从 Fragment A 我发送一个对象到 带有安全参数的片段 B 并导航到它.

I'm using Navigation Components, I have Fragment A and Fragment B, from Fragment A I send an object to Fragment B with safe args and navigate to it.

override fun onSelectableItemClick(position:Int,product:Product) {
        val action = StoreFragmentDirections.actionNavigationStoreToOptionsSelectFragment(product,position)
        findNavController().navigate(action)
    }

现在,在我的 Fragment B 中的一些逻辑之后,我想再次将该数据传送到 Fragment A,我使用

Now, after some logic in my Fragment B , I want to deliver that data to Fragment A again, which I use

  btn_add_to_cart.setOnClickListener {button ->     
 findNavController().previousBackStackEntry?.savedStateHandle?.set("optionList",Pair(result,product_position))
                findNavController().popBackStack()
            }

然后在片段A中,我用

findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Pair<MutableList<ProductOptions>,Int>>("optionList")
            ?.observe(viewLifecycleOwner, Observer {
                storeAdapter.updateProductOptions(it.second,it.first)
            })

现在,这工作正常,但是如果我从 Fragment A 转到 Fragment B 并按下后退按钮,上面的观察者将再次触发复制我当前的数据,当我只按下 Fragment B 中的 btn_add_to_cart 按钮时,有没有办法触发这个观察者?

Now, this is working fine, but if I go from Fragment A to Fragment B and press the back button, the observer above fires again duplicating my current data, is there a way to just fire this observer when I only press the btn_add_to_cart button from Fragment B ?

推荐答案

您使用此扩展:

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 的结果

Fragment B need to set the result of the TestModel.class

ResultTestModel.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.

Fragment B: set data and call popBackStack.

ResultTestModel(id = "xyz", name = "Rasoul")
setNavigationResult(key = "UNIQUE_KEY", result = resultNavigation)
findNavController().popBackStack()

这篇关于当我从一个片段返回到另一个片段时,我的观察者总是在发射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆