所以最后,我找到了解决这个问题的方法。
在撰写此答案时,我使用的是Navigation 2.2.0-alpha01
如果你想直接将一些数据作为参数从宿主活动传递到起始目的地,你需要在宿主活动的 onCreate() 方法中手动设置宿主的导航图,如下所示:
获取导航控制器:
val navController by lazy { findNavController(R.id.<your_nav_host_id>) }
然后在宿主活动的onCreate()
val bundle = Bundle()
bundle.putString("some_argument", "some_value")
navController.setGraph(R.navigation.<you_nav_graph_xml>, bundle)
或者,如果您想将整个意图附加内容原样传递给 startDestination:
navController.setGraph(R.navigation.<you_nav_graph_xml>, intent.extras)
因为intent.extras 只会返回Bundle
当你使用 setGraph() 方法设置 navGraph 时,你应该避免设置 app:NavGraph 属性
NavHostFragment 定义,因为这样做会导致膨胀
并设置导航图两次。
在您的 startDestination 片段中阅读这些参数时:
如果您使用的是Safe Args Plugin(非常推荐),那么在您的片段中:
private val args by navArgs<DummyFragmentArgs>()
Safe Args 插件会通过将 Args 附加到您的片段名称来生成 Args 类。例如,如果您的片段名为DummyFragment,那么 Safe Args 将生成一个名为 DummyFragmentArgs 的类
其中navArgs<>是Android KTX中定义的扩展函数
如果你没有使用 Android KTX,你可以像这样获取 args 对象:
val args = DummyFragmentArgs.fromBundle(arguments!!)
获得参数对象后,您可以简单地获取参数:
args.someArgument
请注意我们是如何将 "some_argument" 作为参数传递的,我们使用 Safe Args 将其读取为 someArgument
如果您没有使用 Safe Args(但没有理由不使用它),您可以像这样访问您的参数:
arguments?.getString("some_argument")
所有这些都记录在此处的“迁移到导航组件”文档中:
https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment