【问题标题】:How to change Scaffold Floating Action Button action with different screens. Jetpack Compose如何使用不同的屏幕更改脚手架浮动操作按钮的操作。喷气背包组成
【发布时间】:2021-07-05 15:58:39
【问题描述】:

如何根据当前屏幕使用 Scaffold 更改 FAB 操作(onClick{})。

            Scaffold(
                floatingActionButton = {
                    FloatingActionButton(onClick = { 
                        //Different actions here depending on current screen
                    }) { }
                }
            ) {
                NavHost(
                    navController = navController,
                    startDestination = "route1"
                ) {
                    composable(
                        route = "route1"
                    ) {
                        ScreenOne()
                    }

                    composable(
                        route = "route2"
                    ) {
                        ScreenTwo()
                    }
                }
            }

例如,我想使用 ScreenOne() 将一些实体添加到数据库中,而使用 ScreenTwo() 我想保存已编辑的实体。而这一切都使用 Scaffold 共享的同一个 FAB。

更新: 刚刚明白我还需要提到我还需要FAB知道一些数据才能操作。例如我想通过点击 FAB 将一些实体保存到数据库中,所以 FAB 需要知道这个实体。

示例: 我正在单击列表中的某个项目。它用一些实体打开一些导航方向。我正在修改此实体并单击 FAB 以保存已编辑的实体。

【问题讨论】:

    标签: android android-jetpack-compose android-jetpack-compose-scaffold


    【解决方案1】:

    您可以观察NavController的当前路线并进行相应的操作。

    // When you navigate to another screen, this value is updated.
    val currentRoute = navController
        .currentBackStackEntryFlow
        .collectAsState(initial = navController.currentBackStackEntry)
    
    Scaffold(
        floatingActionButton = {
            FloatingActionButton(
                onClick = {
                    when (currentRoute.value?.destination?.route) {
                        "screen1" -> { /* Action for Screen 1 */ }
                        "screen2" -> { /* Action for Screen 2 */ }
                        // ...
                    }
                }
            ) {
                Icon(Icons.Default.Add, contentDescription = null)
            }
        }
    ) {
        NavHost(navController = navController, startDestination = "screen1") {
            composable("screen1") { Screen1() }
            composable("screen2") { Screen2() }
        }
    }
    

    【讨论】:

    • 如果我需要来自 Routes 的一些数据怎么办?例如,如果我需要根据它的 id 保存一些实体,并且只有这个屏幕知道这个 id?
    • currentRoute 是一个 NavBackStackEntry。因此,您可以使用它获取参数,例如使用currentRoute.value?.arguments?.getString("yourParam")
    【解决方案2】:

    如果您使用Navigation,您可以通过rememberNavController() 检索navController,然后将其用于getCurrentBackStackEntry().destination,在onClick 块中应用条件并相应地设置操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多