You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中如何保持SplashScreen直至DataStore加载完成?

问题分析与修复方案

你的代码核心问题在于加载状态的逻辑完全反转,同时缺少对DataStore加载完成后的状态处理优化,导致启动屏无法按预期保持到加载完成。

问题点拆解

  1. 初始状态错误:isLoading初始设为false,直接让setKeepOnScreenCondition返回false,启动屏会立刻关闭,等DataStore加载完成时已经来不及拦截。
  2. 持续监听冗余:dataStore.data.collect会持续监听数据变化,而我们只需要确认第一次加载完成即可,无需重复触发状态更新。
  3. 状态捕获滞后:未使用rememberUpdatedState确保setKeepOnScreenCondition的lambda能拿到最新的isLoading值。

修复后的代码

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)
        setContent {
            val dataStore = this.dataStore
            // 初始设为true,保持启动屏显示直到加载完成
            var isLoading by remember { mutableStateOf(true) }

            LaunchedEffect(Unit) {
                try {
                    // 仅获取一次DataStore数据,确认加载完成
                    dataStore.data.first()
                    // 加载完成后关闭启动屏
                    isLoading = false
                } catch (e: Exception) {
                    // 处理DataStore读取异常,避免启动屏一直显示
                    isLoading = false
                }
            }

            // 确保lambda能捕获最新的isLoading状态
            val keepOnScreen by rememberUpdatedState(isLoading)
            splashScreen.setKeepOnScreenCondition { keepOnScreen }

            MyAppTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    MyApp()
                }
            }
        }
    }
}

额外优化建议

你的启动屏主题配置基本正确,但可以适当调整动画时长,让过渡更自然:

<resources>
        <style name="Theme.Kanago.Starting" parent="Theme.SplashScreen">
            <item name="windowSplashScreenBackground">#FFFFFF</item>
            <item name="windowSplashScreenAnimatedIcon">@drawable/splash_screen_icon</item>
            <!-- 调整为更合理的动画时长,比如1000ms -->
            <item name="windowSplashScreenAnimationDuration">1000</item>
            <item name="postSplashScreenTheme">@style/Theme.Kanago</item>
        </style>
</resources>

内容的提问来源于stack exchange,提问作者user13926345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:16:12