在 Android 上后台加载数据后显示第一个屏幕

问题描述 投票:0回答:1

我正在使用所有现代 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)
                }
            }
        }
    }

}
android android-jetpack-compose android-viewmodel
1个回答
0
投票

我遇到了这个问题,只需显示启动屏幕,直到条件工作未完成,完成后显示特定页面

© www.soinside.com 2019 - 2024. All rights reserved.