如何将函数从 ViewModel 传递到 Jetpack Compose 中脚手架的浮动操作按钮?

How do I pass a function from a ViewModel to my scaffold's floating action button in Jetpack Compose?

我正在使用纯 Jetpack Compose 构建一个 Android 应用程序。我的整个应用程序都包裹在一个脚手架下,并且我的应用程序中的每个“屏幕”(可组合项)都有一个 ViewModel。因此,我的脚手架中有一些条件语句来根据路线确定浮动操作按钮 (FAB)。但是,其中一个 FAB 需要访问 ViewModel 中的一个函数,该函数仅在我导航到包含该可组合项的路由时创建,而我不知道让 FAB 访问该视图模型函数的最佳方式.

采用以下示例(基于我的代码),并记下路由“route3”的 FAB。

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            MyApp()
        }
    }

    @Composable
    fun MyApp() {
        val navController = rememberNavController()
        val backstackEntry = navController.currentBackStackEntryAsState()
        val scaffoldState = rememberScaffoldState()

        Surface(color = MaterialTheme.colors.background) {
            Scaffold(
                topBar = { ... },
                bottomBar = { ... },
                floatingActionButton = {
                    when (backstackEntry.value?.destination?.route) {
                        "route2" -> FAB2(navController)
                        "route3" -> FAB3(navController) // Needs to access function from viewModel3
                    }
                },
                scaffoldState = scaffoldState,
            ) {
                MyNavHost(navController, scaffoldState)
            }
        }
    }

    @Composable
    fun MyNavHost(navController: NavHostController, scaffoldState: ScaffoldState) {
        NavHost(
            navController = navController,
            startDestination = "route1"
        ) {
            composable("route1") { Destination1() }
            composable("route2") { Destination2() }
            composable("route3") { Destination3() }
        }
    }

    @Composable
    fun Destination1() { ...}

    @Composable
    fun Destination2() { ... }

    @Composable
    fun Destination3() {
        val viewModel3: CustomViewModel = hiltViewModel()
        Screen3(viewModel3)
    }

}

所以我的主要问题是,如果 FAB3 变量需要从 viewModel3 访问一个函数,我该怎么做呢?

我决定改用每个屏幕的脚手架。

老实说,这使得管理路由变得容易得多,因为在单个脚手架场景中,管理大型 when() 块中的 TopBar 和 FAB 等所有可能的路由变得越来越困难。

但是,如果有人对原始问题有解决方案,我们将不胜感激!