起因:
目前我们是flutter项目,有个需求是需要在app内引导用户去appStore或是安卓的应用商店去评价,该需求我选用了两个插件in_app_review 和 launch_review, 然而仔做的过程中发现一个问题,当弹出系统的跳转应用商店的弹框时,iOS是单一弹框,Android是弹出一个选择打开商店的弹窗,可选择打开一次或是始终选择某一个商店打开,此时锁屏,然后再解锁,发现iOS没啥问题,安卓系统弹框后的flutter页面黑屏了
原因:
看到这个现象,目测是由于安卓的生命周期和flutter的生命周期没有同步,以下是验证过程
安卓的MainActivity添加生命周期方法
override fun onStart() {
super.onStart()
println("kotlin 收到了消息1onStart")
// flutterEngine!!.lifecycleChannel.appIsResumed()
}
override fun onStop() {
super.onStop()
println("kotlin 收到了消息1onStop")
}
override fun onPause() {
super.onPause()
println("kotlin 收到了消息1onPause")
}
flutter 添加生命周期方法
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
print("-didChangeAppLifecycleState-" + state.toString());
switch (state) {
case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假 设它们可能在任何时候暂停。
print('这是冷启动');
break;
case AppLifecycleState.resumed: //从后台切换前台,界面可见
print('这是resumed');
break;
case AppLifecycleState.paused: // 界面不可见,后台
print('这是paused');
break;
case AppLifecycleState.detached: // APP结束时调用
break;
}
}
还是刚才的场景 锁屏 安卓和flutter的后台方法都调用,解锁回到前台 只有安卓的前台方法走 MainActivity会restart,flutter的resume方法,没有调用,验证了开始的猜想,是由于flutter没有检测到前台操作或是这种情况flutter不认为自己在前台,导致flutter没有执行页面的重新绘制导致黑屏
解决:
关于flutter的生命周期,查阅资料发现 我们可以手动刷新flutter页面的状态,即使用
flutterEngine!!.lifecycleChannel.appIsResumed()
我们只需要在MainActivity restart的时候调用上述 方法 告知flutter重绘,该问题就解决了
关于原生加载flutter页面 生命周期相关 看这里 能有一些启发