通过 NavigationComponent 在 BottomNavigation 片段之间传递数据



是否可以通过NavigationContoller在BottomNavigation控制的片段之间传递可包裹的对象/参数?

这是我的应用程序的流程,用户登录到应用程序并打开一个包含底部导航的片段。我能够将参数发送到第一个片段(第一个片段使用NavHostFragment.findNavController(this).navigate(action)打开(我能够向此操作添加参数并传递值,但 BottomNavigation 没有任何导航指令导航是通过 menuID 完成的。我如何通过捆绑在所有这些底部导航片段之间传递登录的用户参数。

我尝试使用 onDestinationChanged(( 传递参数

@Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
NavArgument argument = new NavArgument.Builder().setDefaultValue(selectedUser).build();
destination.addArgument("user", argument);
}

但应用程序仍然崩溃并java.lang.IllegalArgumentException: Required argument "user" is missing and does not have an android:defaultValue

我们可以像asad提到的那样使用SharedViewModel,也可以使用NavGraph来设置参数

navController.getGraph().findNode(R.id.todoFragment)
.addArgument("user", new NavArgument.Builder()
.setDefaultValue(user)
.build());
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

navController = Navigation.findNavController(getActivity(), R.id.navBottomNavigation);
NavigationUI.setupWithNavController(R.id.bottomNavigationView, navController);
NavGraph navGraph = navController.getNavInflater().inflate(R.navigation.nav_sub_graph);
NavArgument argument = new NavArgument.Builder().setDefaultValue(yourObject).build();
navGraph.addArgument("yourObject",argument);
navController.setGraph(navGraph);
}
在底部导航中传递对象嵌套片段

navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
@Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
switch (destination.getId()) {
case R.id.profileFragment:
NavArgument argumentProfile = new NavArgument.Builder().setDefaultValue(yourObject).build();
destination.addArgument("yourObject",argumentProfile);
case R.id.homeFragment:
NavArgument argumentHome = new NavArgument.Builder().setDefaultValue(yourObject).build();
destination.addArgument("yourObject",argumentHome);
case R.id.orderFragment:
NavArgument argumentOrder = new NavArgument.Builder().setDefaultValue(yourObject).build();
destination.addArgument("yourObject",argumentOrder);
}
}
});

您也可以在导航文档中使用 SharedViewModel 在它们引用的目标之间传递数据

一般来说,您应该强烈希望只传递最少的金额 目标之间的数据。例如,您应该将密钥传递给 检索对象而不是传递对象本身,作为总计 在安卓上,所有已保存状态的空间都是有限的。如果您需要通过 大量数据,请考虑使用 ViewModel,如中所述 在片段之间共享数据。

相关内容

  • 没有找到相关文章

最新更新