我怎么 运行 我的逻辑代码在可组合函数中只有 1 次?
How could i run my logic code inside composable function just 1 time?
我正在使用 ViewModel
和 ComposeView
进行我的测试项目。
我的架构包括:一个 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 -> {
}
}
}
有人有解决方案可以帮助我解决该架构问题吗?
您的可组合函数应该没有副作用。
如果你想 运行 一次。您可以执行以下操作
LaunchedEffect(Unit){
preloadViewModel.getSyncData()
}
或者在您的情况下,如果在 ViewModel 初始化时必须同步数据,您可以在 ViewModel 内的 init 块中调用此函数。
查看官方文档https://developer.android.com/jetpack/compose/side-effects
我正在使用 ViewModel
和 ComposeView
进行我的测试项目。
我的架构包括:一个 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 -> {
}
}
}
有人有解决方案可以帮助我解决该架构问题吗?
您的可组合函数应该没有副作用。
如果你想 运行 一次。您可以执行以下操作
LaunchedEffect(Unit){
preloadViewModel.getSyncData()
}
或者在您的情况下,如果在 ViewModel 初始化时必须同步数据,您可以在 ViewModel 内的 init 块中调用此函数。
查看官方文档https://developer.android.com/jetpack/compose/side-effects