【发布时间】:2022-07-27 23:55:50
【问题描述】:
在从 Navhost 导航期间,我发现可组合屏幕正在多次重新组合。因此,我的 ViewModel 也多次调用 API 数据源。
@Composable
fun MainView() {
val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
val scope = rememberCoroutineScope()
val navController = rememberNavController()
Scaffold(
scaffoldState = scaffoldState,
topBar = { TopBar(
toolbarTitle = stringResource(id = R.string.app_name),
scope = scope,
scaffoldState = scaffoldState
) },
drawerContent = {
DrawerView(scope = scope, scaffoldState = scaffoldState, navController = navController)
},
) {
NavGraph(navController = navController)
}
}
@Composable
fun NavGraph(navController: NavHostController) {
NavHost(navController, startDestination = NavDrawerItem.Repositories.route) {
composable(NavDrawerItem.Repositories.route) {
RepoListView(getViewModel())
}
composable(NavDrawerItem.EmojiList.route) {
EmojiListView(getViewModel())
}
}
}
class RepoListViewModel(
private val repositoriesUseCase: GetRepositoriesUseCase
): ViewModel() {
init {
getRepositories()
}
@Composable
fun RepoListView(viewModel: RepoListViewModel) {
AppTheme {
RepoListContent(viewModel)
}
}
有办法处理吗? 我的意思是,我知道 Android Compose 就是这样工作的。但是,如何在导航屏幕中处理 API 调用?
编辑
问题出在 Koin 本身。一个新版本已经到来,现在它可以正常工作了。
【问题讨论】:
-
你的 DrawerView 是什么样子的
-
getViewModel不应在每次重组时创建新实例。我唯一的猜测是您可以多次拨打navigate,这将为每次呼叫创建一条新路线-请查看this answer了解详细信息。如果这没有帮助,请将您的代码更新为minimal reproducible example,因为现在它无法运行。 -
正如我所说,如果没有minimal reproducible example,很难为您提供帮助。首先显示您的 Koin 模块设置。问题出现在初始屏幕出现期间或您尝试导航到其他屏幕时?在第二种情况下,显示您用于执行导航的代码
-
getViewModel()是做什么的?如果它除了调用viewModel()方法之外还做任何事情,那么这就是你的问题。预计,只要您在目的地之间进行动画处理,它们就会在每一帧上重新组合。
标签: android android-jetpack-compose android-jetpack-navigation