0

寻找一种更优雅的方式来使用 Jetpack 传输数据

现在我传递数据如下:

override fun onListItemClick(itemIndex: Int, itemCode: String) {
        val bundle = Bundle()
        bundle.putString(KEY_TARGET_GUID, (adapter.getItem(itemIndex) as Target).guid)
        findNavController().navigate(R.id.target_edit, bundle)
    }

并像这样在另一个片段中获取它:

private val targetGuid: String
        get() = arguments?.getString(KEY_TARGET_GUID, "") ?: ""

我看过谷歌的人在codelab中做的,但在他的例子中他们创建了类FlowStepFragmentArgs,而且它是大量的

data class FlowStepFragmentArgs(val flowStepNumber: Int = 2) : NavArgs {
    fun toBundle(): Bundle {
        val result = Bundle()
        result.putInt("flowStepNumber", this.flowStepNumber)
        return result
    }

    companion object {
        @JvmStatic
        fun fromBundle(bundle: Bundle): FlowStepFragmentArgs {
            bundle.setClassLoader(FlowStepFragmentArgs::class.java.classLoader)
            val __flowStepNumber : Int
            if (bundle.containsKey("flowStepNumber")) {
                __flowStepNumber = bundle.getInt("flowStepNumber")
            } else {
                __flowStepNumber = 2
            }
            return FlowStepFragmentArgs(__flowStepNumber)
        }
    }
}

:在我的情况下,我怎样才能漂亮地传输数据

4

2 回答 2

2

使用导航架构,您可以这样做:- 让您在 navigation.xml 文件中声明片段为:-

 <fragment
    android:id="@+id/fragment_a"
    android:name="com.example.FragmentA">
    <action android:id="@+id/action_item_click"
        app:destination="@id/fragment_b" />
</fragment>

<fragment
    android:id="@+id/fragment_b"
    android:name="com.example.fragmentB">
    <argument android:name="id" app:argType="string" android:defaultValue="sample data" />
</fragment>

笔记 :-

  1. 为动作发起的每个目的地创建一个类。此类的名称是始发目的地的名称,附加单词“ Directions ”。
  2. 此类对在始发目的地中定义的每个动作都有一个方法。

因此,对于FragmentA类,它将生成为FragmentADirections例如。-

override fun onListItemClick(itemIndex: Int, itemCode: String) {
    findNavController().navigate(FragmentADirections.actionItemClick("Pass YOUR_STRING"))
}

笔记 :-

  1. 为接收目的地创建一个类。这个类的名字就是目的地的名字,加上单词“ Args ”。

对于FragmentB类,它将生成,因为您可以将数据作为FragmentBArgs例如:-

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // do what you want with this id
    arguments?.let {bundle->
       val id = FragmentBArgs.fromBundle(bundle).id
    }
              // OR you can do also as
    // val id = arguments?.getString("id").orEmpty()
}

更多详情请参考https://developer.android.com/guide/navigation/navigation-pass-data

于 2019-10-09T16:31:04.993 回答
0

据我所知,使用 Jetpack Navigation 传递数据实际上只有 2 个选项。

1)使用捆绑。在这里我发现budnleOf(x to y)功能真的很方便

    val targetGuid = adapter.getItem(itemIndex) as Target).guid)
    val bundle = bundleOf(KEY_TARGET_GUID, targetGuid)
    findNavController().navigate(R.id.target_edit, bundle)

2)通过在导航图中定义目的地的参数。这将生成代码。假设你R.id.target_edit是一个片段:

<fragment
    android:id="@+id/target_edit"
    android:name="com.example.TargetEditFragment"
    tools:layout="@layout/fragment_target_edit">
    <argument
        android:name="targetGuid"
        android:defaultValue="@null"
        app:argType="com.example.Target"
        app:nullable="true"/>
 </fragment>

然后在你的TargetEditFragment

override fun onCreate(savedInstanceState: Bundle?) {
  val targetGuid =
    arguments?.let { TargetEditFragmentArgs.fromBundle(it).targetGuid }
}
于 2019-10-09T15:54:29.063 回答