0

我正在使用纯粹的 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,我将如何去做?

4

1 回答 1

0

我决定只切换到为每个屏幕使用脚手架。

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

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

于 2022-01-16T18:33:04.540 回答