Jetpack Compose中如何保持SplashScreen直至DataStore加载完成?
问题分析与修复方案
你的代码核心问题在于加载状态的逻辑完全反转,同时缺少对DataStore加载完成后的状态处理优化,导致启动屏无法按预期保持到加载完成。
问题点拆解
- 初始状态错误:
isLoading初始设为false,直接让setKeepOnScreenCondition返回false,启动屏会立刻关闭,等DataStore加载完成时已经来不及拦截。 - 持续监听冗余:
dataStore.data.collect会持续监听数据变化,而我们只需要确认第一次加载完成即可,无需重复触发状态更新。 - 状态捕获滞后:未使用
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
相关产品推荐
相关产品推荐

