【发布时间】:2021-07-23 08:10:57
【问题描述】:
在我的视图模型中,我有一个向服务器发送登录请求的功能,成功后我想更新 SharedFlow 并使用此触发器导航到另一个屏幕
class loginViewModel: ViewModel() {
private val _authToken = MutableSharedFlow<AuthToken>()
val authToken: SharedFlow<AuthToken> = _authToken
fun login() {
...loginRequest
.onSuccess {
_authToken.emit(value)}
}
在我的导航图中,我像这样设置视图模型
private fun NavGraphBuilder.addLogin(navController: NavController) {
composable(AuthenticationScreens.Login.route) {
val loginViewModel: LoginViewModel = hiltViewModel()
val authToken by loginViewModel.authToken.collectAsState()
LoginScreen(
authToken = authToken,
viewModel = loginViewModel,
navigateToDashboard= {
navController.navigate(Dashboard.Dashboard.route)
}
)
}
}
然后,当 SharedFlow 更新时,我会在我的登录屏幕中进行 if 检查以导航到另一个屏幕
@Composable
fun LoginScreen(
authToken: AuthToken,
viewModel: LoginViewModel,
navigateToDashboard: () -> Unit) {
if (authToken.isNotBlank()) {
navigateToDashboard()}
}
代码会触发,但即使在我导航到下一个屏幕时也会不断调用,从而导致大量闪烁和糟糕的 UI。有没有一种不同的方式我应该处理这样的导航事件,或者有一种方式让可组合只在需要时读取一次值?
【问题讨论】:
标签: android android-jetpack-compose