我正在使用所有现代 Android 开发堆栈(Compose UI 和导航、ViewModels 等)以及首选项数据存储来存储 AuthState(来自 AppAuth)。
我在加载应用程序的初始状态时遇到问题。 我想根据身份验证状态加载登录屏幕或主屏幕。
我对下面的解决方案不太满意。由于 DataStore 交互是异步的,因此在确定第一个屏幕之前会有一个小的延迟。 如果我不使用 if 语句“保护”AppScreen 可组合项,当用户已经通过身份验证时,它将在导航到主屏幕之前快速显示登录屏幕。
您有什么建议或更好的方法来实现这一目标吗?
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val viewModel: AppViewModel by viewModels()
setContent {
val authState by viewModel.appState.collectAsState()
// maintain splashscreen while loading initial state
val view = LocalView.current
view.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
return if (authState != AppState.INITIALIZING) {
view.viewTreeObserver.removeOnPreDrawListener(this)
true
} else {
false
}
}
})
MyAppTheme {
if (authState != AppState.INITIALIZING) {
AppScreen(viewModel = viewModel)
}
}
}
}
}
我遇到了这个问题,只需显示启动屏幕,直到条件工作未完成,完成后显示特定页面