【问题标题】:How could i run my logic code inside composable function just 1 time?我怎样才能在可组合函数中运行我的逻辑代码 1 次?
【发布时间】:2021-09-30 07:46:37
【问题描述】:

我正在使用ViewModelComposeView 进行我的测试项目。

我的架构包括:一个Activity 和多个ComposeView,使用如下导航:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MainView()
        }
    }
}
@Composable
fun MainView() {
    TestComposeTheme {
        val navController = rememberNavController()
        Surface(color = MaterialTheme.colors.background) {
            NavHost(
                navController = navController,
                startDestination = KYCScreen.getName(),
            ) {
                navigation(startDestination = KYCScreen.Preload.name, route = KYCScreen.getName()) {
                    composable(KYCScreen.Preload.name) { PreloadView(navHostController = navController) }
                    composable(KYCScreen.StartKYC.name) { StartView(navHostController = navController) }
                    composable(KYCScreen.Login.name) { LoginView(navHostController = navController) }
                }
                navigation(startDestination = HomeScreen.Home.name, route = HomeScreen.getName()) {
                    composable(HomeScreen.Home.name) { HomeView(navHostController = navController) }
                }
            }
        }
    }
}

当我包含在执行可组合函数时执行的逻辑时,就会出现问题,我的逻辑代码被循环了很多次。这是我的代码:

@Composable
fun PreloadView(navHostController: NavHostController) {
    val preloadViewModel: PreloadViewModel = viewModel()
    preloadViewModel.getSyncData()
    val syncState by preloadViewModel.uiStateSync.observeAsState()
    syncState?.let { PreloadContent(navHostController = navHostController, it) }
}

@Composable
fun PreloadContent(navHostController: NavHostController, uiState: UiState<SyncResponse>) {
    when (uiState.state) {
        RequestState.SUCCESS -> {
            navHostController.navigate(KYCScreen.StartKYC.name)
        }
        RequestState.FAIL -> {
            Box(
                contentAlignment = Alignment.Center,
                modifier = Modifier
                    .fillMaxHeight()
                    .fillMaxWidth()
            ) {
                Text(text = "Error", color = Color.Black)
            }
        }
        RequestState.NON -> {

        }
    }
}

任何人有解决方案来帮助我处理该架构?

【问题讨论】:

    标签: android kotlin android-jetpack-compose android-viewmodel


    【解决方案1】:

    您的可组合函数应该没有副作用。

    如果您只想运行一次。您可以执行以下操作

     LaunchedEffect(Unit){
         preloadViewModel.getSyncData()
     }
    

    或者在您的情况下,如果在 ViewModel 初始化时必须同步数据,您可以在 ViewModel 的 init 块中调用此函数。

    查看官方文档https://developer.android.com/jetpack/compose/side-effects

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2011-01-26
      • 2014-01-12
      • 2021-09-30
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2017-12-05
      相关资源
      最近更新 更多