2

由于导航文件位于 app 模块中,因此功能模块将无法访问 Args 文件。有什么解决方法吗?

示例:如果我有一个像这样接受电子邮件和密码的片段

<fragment
        android:id="@+id/navigation_sample"
        android:name="SampleFragment">
        <argument
            android:name="email"
            app:argType="string" />
        <argument
            android:name="password"
            app:argType="string" />
    </fragment>

我会生成一个可用于导航的 SampleFragmentArgs

findnavController.navigate(R.id.navigation_sample, SampleFragmentArgs(email, password).toBundle)

但是我只能从应用程序模块而不是功能模块中使用它

4

1 回答 1

3

这取决于您所说的“功能模块”,但是我假设它应该是 android 库。

这是有效的设置:

  1. 假设您的 android 库名为“mylibrary”
  2. 您的“应用程序”模块自然应该具有以上作为依赖项
  3. 您的“mylibrary”应该apply plugin: "androidx.navigation.safeargs.kotlin"在库顶级 build.gradle 的类路径中具有相应的设置
  4. 让我们在库中声明导航图(例如,带有 id myLibraryGraph 的 mylibrary_graph.xml),就像您在“app”模块中所做的那样 - 假设它以您的“SampleFragment”作为起点,列出了所有这些参数。
  5. 假设您的“app”模块有一些导航图,让我们将“mylibrary_graph.xml”嵌套在其中(<include app:graph="@navigation/mylibrary_graph" />
  6. 假设您的“应用程序”模块导航图有一些片段需要跳转到您的 android 库中的“SampleFragment”。我们将这样声明它(伪代码):
    <fragment
        android:id="@+id/HelloWorldFragment"
        android:name="..."
        android:label="..."
        tools:layout="...">

        <action
            android:id="@+id/jumpToSampleFragment"
            app:destination="@+id/myLibraryGraph">

          <argument
              android:name="email"
              app:argType="string" />
          <argument
              android:name="password"
              app:argType="string" />
        </action>
    </fragment>
  1. 最后,您可以在 HelloWorldFragment 中执行此操作:findNavController().navigate(HelloWorldFragmentDirections.jumpToSampleFragment("oh@acme.com", "nimda"))

正如人们所看到的那样,它可以工作,但是在 2 个地方声明参数会带来一些不便。

于 2020-06-24T20:40:46.063 回答