2

如何根据当前屏幕使用 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 以保存已编辑的实体。

4

2 回答 2

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() }
    }
}
于 2021-07-09T00:22:33.937 回答
0

如果您正在使用Navigation,您可以检索navControllerbyrememberNavController() 然后使用它,在块getCurrentBackStackEntry().destination中应用条件并相应地设置操作onClick

于 2021-07-05T16:52:41.457 回答