在片段导航组件之间传递数据的更好方法



导航组件中片段之间的数据很容易。假设从AB您只需用SafeArgs设置arguments,就完成了。

但是,将数据从B传递回A时会很棘手。

根据文档,我们可以使用SharedViewModel,这很好。但是我正在寻找从B传递数据回到A的更好方法。

使用SharedViewModel的问题是,您必须为需要传递数据的每个片段对创建SharedViewModel

有什么建议吗?如果您可以考虑任何注释处理方法,您非常欢迎您推荐。

如果您不想使用SharedViewModel方式,则可以按照下一个方法:

1- 为您的Details Fragment定义委托。(此代表必须实现SerializableParcelable

interface DetailsFragmentDelegate: Serializable {
    fun onSomething1(someData1: SomeData1)
    fun onSomething2(someData2: SomeData2)
}

2- nav_graph.xml

中的Details Fragment参数添加委托

3- 当您的Base Fragment导航到目的地时,将委托传递到您的Details Fragment

findNavController().navigate(
    BaseFragmentDirections.actionBaseFragmentToDetailsFragment(
        object: DetailsFragmentDelegate {
            // override delegate methods
        }
    )
)

4- Details Fragment中获取委托参数,并在需要的任何地方传递数据:

....
delegate.onSomething1(data1)
....
delegate.onSomething2(data2)
....

我不确定有更好的方法,但是它正在工作...

您不需要每个片段对创建一个ViewModel。我正在做的是每个片段创建一个ViewModel。每个ViewModel都会有一个名为邮箱的地图[类[fragment],任何]。

每个片段将定义一个片段的类型,每个片段类型都不同。

在儿童片段中 onbackpressedhandler ,在弹出之前,从活动中获取父viewModel,并将您的结果放入类的邮箱中。您将需要一个ViewModel类。请参阅下面。

父母片段需要将其ViewModel.class传递给孩子片段,然后才能启动它。

当父母从堆栈中弹出孩子后,重新启动了父片时。从IT的ViewModel获取邮箱地图,检查是否有一个键,该键带有预期的FragmentChild :: class。如果是这样,则将其施放为所需的类型。

父母片段视图模型需要保存谁是它发射的最后一个孩子。

我正在为此使用回调接口。因此,我创建了一个使用某些方法的接口。我实现了该接口" a",然后从" b"中调用。非常容易,效果很好。

最新更新