起因:
目前我們是flutter項(xiàng)目,有個(gè)需求是需要在app內(nèi)引導(dǎo)用戶去appStore或是安卓的應(yīng)用商店去評(píng)價(jià),該需求我選用了兩個(gè)插件in_app_review 和 launch_review, 然而仔做的過程中發(fā)現(xiàn)一個(gè)問題,當(dāng)彈出系統(tǒng)的跳轉(zhuǎn)應(yīng)用商店的彈框時(shí),iOS是單一彈框,Android是彈出一個(gè)選擇打開商店的彈窗,可選擇打開一次或是始終選擇某一個(gè)商店打開,此時(shí)鎖屏,然后再解鎖,發(fā)現(xiàn)iOS沒啥問題,安卓系統(tǒng)彈框后的flutter頁面黑屏了
原因:
看到這個(gè)現(xiàn)象,目測(cè)是由于安卓的生命周期和flutter的生命周期沒有同步,以下是驗(yàn)證過程
安卓的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: // 處于這種狀態(tài)的應(yīng)用程序應(yīng)該假 設(shè)它們可能在任何時(shí)候暫停。
print('這是冷啟動(dòng)');
break;
case AppLifecycleState.resumed: //從后臺(tái)切換前臺(tái),界面可見
print('這是resumed');
break;
case AppLifecycleState.paused: // 界面不可見,后臺(tái)
print('這是paused');
break;
case AppLifecycleState.detached: // APP結(jié)束時(shí)調(diào)用
break;
}
}
還是剛才的場(chǎng)景 鎖屏 安卓和flutter的后臺(tái)方法都調(diào)用,解鎖回到前臺(tái) 只有安卓的前臺(tái)方法走 MainActivity會(huì)restart,flutter的resume方法,沒有調(diào)用,驗(yàn)證了開始的猜想,是由于flutter沒有檢測(cè)到前臺(tái)操作或是這種情況flutter不認(rèn)為自己在前臺(tái),導(dǎo)致flutter沒有執(zhí)行頁面的重新繪制導(dǎo)致黑屏
解決:
關(guān)于flutter的生命周期,查閱資料發(fā)現(xiàn) 我們可以手動(dòng)刷新flutter頁面的狀態(tài),即使用
flutterEngine!!.lifecycleChannel.appIsResumed()
我們只需要在MainActivity restart的時(shí)候調(diào)用上述 方法 告知flutter重繪,該問題就解決了
關(guān)于原生加載flutter頁面 生命周期相關(guān) 看這里 能有一些啟發(fā)