React Native集成Android原生启动屏:setKeepOnScreenCondition仍自动关闭
问题诊断
出现黑屏和动画异常的核心原因有两个:
- React Native 内容未就绪时启动屏提前退出:当
setKeepOnScreenCondition { false }触发时,React Native的根视图还没完成渲染,此时postSplashScreenTheme对应的窗口没有可显示内容,导致短暂黑屏。 - 退出动画触发时机与启动屏保留逻辑冲突:系统会在满足默认条件时提前触发
setOnExitAnimationListener,但此时setKeepOnScreenCondition { true }强制保留启动屏,导致动画在后台执行,直到条件变为false才会显示剩余部分。
解决方案
1. 调整MainActivity代码逻辑
确保在React Native完全初始化、根视图渲染完成后再关闭启动屏,同时修正动画执行逻辑:
class MainActivity : ReactActivity() { override fun onCreate(savedInstanceState: Bundle?) { val splashScreen: SplashScreen = installSplashScreen() var isRnReady = false splashScreen.apply { setKeepOnScreenCondition { !isRnReady } setOnExitAnimationListener { splashScreenView -> // 实现启动屏淡出动画,确保可见且流畅 splashScreenView.animate() .alpha(0f) .setDuration(300) .withEndAction { splashScreenView.remove() } .start() } } // 监听React Native初始化完成事件 reactInstanceManager.addReactInstanceEventListener(object : ReactInstanceManager.ReactInstanceEventListener { override fun onReactContextInitialized(context: ReactContext) { // 延迟确保根视图渲染完成 Handler(Looper.getMainLooper()).postDelayed({ isRnReady = true }, 200) } }) super.onCreate(savedInstanceState) } override fun getReactInstanceManager(): ReactInstanceManager { return (application as MainApplication).reactNativeHost.reactInstanceManager } }
2. 优化样式配置消除黑屏
在AppTheme中添加与启动屏一致的背景色,填补启动屏退出后RN视图未就绪的间隙:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="android:editTextBackground">@drawable/rn_edit_text_material</item> <!-- 同步启动屏背景色,避免黑屏 --> <item name="android:windowBackground">@color/splashscreen_background</item> </style>
3. 适配InitLoadingManager逻辑(若需保留)
如果必须依赖InitLoadingManager判断初始化完成,需确保回调时机在RN视图就绪之后:
lateinit var onInitLoadingFinishedHandler: () -> Unit onInitLoadingFinishedHandler = { Handler(Looper.getMainLooper()).postDelayed({ isRnReady = true InitLoadingManager.removeListener { onInitLoadingFinishedHandler() } }, 300) } InitLoadingManager.addListener { onInitLoadingFinishedHandler() }
关键说明
setKeepOnScreenCondition { !isRnReady }:用布尔变量直接控制启动屏保留状态,避免闭包逻辑陷阱- 动画中必须调用
splashScreenView.remove():确保动画结束后启动屏视图被正确清理 - 同步窗口背景色:彻底消除启动屏与RN视图切换时的视觉断层
内容的提问来源于stack exchange,提问作者Zukuan JING
相关产品推荐
相关产品推荐

