【问题标题】:How do I pass a function from a ViewModel to my scaffold's floating action button in Jetpack Compose?如何将 ViewModel 中的函数传递到 Jetpack Compose 中脚手架的浮动操作按钮?
【发布时间】:2022-01-15 05:05:00
【问题描述】:

我正在使用纯粹的 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 的函数,我该怎么做呢?

【问题讨论】:

  • 同样的问题。

标签: mvvm android-jetpack-compose android-viewmodel dagger-hilt android-jetpack-compose-scaffold


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 2022-06-25
    • 2021-11-11
    • 2021-08-31
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    相关资源
    最近更新 更多