
老孟導讀:關于生命周期的文章共有2篇,一篇(此篇)是介紹 Flutter 中Stateful 組件的生命周期,
第二篇是 Flutter 中與平臺相關的生命周期,
博客地址:http://laomengit.com/blog/20201227/%E7%9B%B8%E5%85%B3%E5%B9%B3%E5%8F%B0%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html
博客中還有更多精彩文章,也歡迎加入 Flutter 交流群,
此篇文章所說的生命周期與 StatefulWidget 組件的生命周期是不同的,這里平臺相關的生命周期指的是特定平臺相關操作所產生的生命周期,比如 Android 中 App 退到后臺后的onPause等,
有人下場景,App正在播放視頻,此時回到手機桌面或者切換到其他App,那么此時視頻應該暫停播放,Flutter 中使用 AppLifecycleState 實作:
class AppLifecycle extends StatefulWidget {
@override
_AppLifecycleState createState() => _AppLifecycleState();
}
class _AppLifecycleState extends State<AppLifecycle>
with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
//TODO
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('App 生命周期'),
),
body: Center(
child: Text(''),
),
);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
}
重點是重寫 didChangeAppLifecycleState 方法,AppLifecycleState 中的狀態包括:resumed、inactive、paused、detached,
didChangeAppLifecycleState 方法的回呼來源于系統的通知(notifications),正常情況下,App是能正常接收到這些通知,但有的情況下是無法接收到通知的,比如用戶強制關機、手機沒有電自動關機等,
下面對其狀態詳細說明:
- resumed:應用程式可見且回應用戶輸入,
- inactive:應用程式處于非激活狀態,無法回應用戶輸入,在iOS上,打電話、回應TouchID請求、進入應用程式切換器或控制中心都處于此狀態,在Android上,分屏應用,打電話,彈出系統對話框或其他視窗等,
- pause:應用程式不可見且無法回應用戶輸入,運行在后臺,處于此狀態時,引擎將不會呼叫 Window.onBeginFrame 和 Window.onDrawFrame,
- detached:應用程式仍寄存在Flutter引擎上,但與平臺 View 分離,處于此狀態的時機:引擎首次加載到附加到一個平臺 View的程序中,或者由于執行 Navigator pop ,view 被銷毀,
下面是關于生命周期經常遇到的問題:
有2個頁面A和B,在B頁面點擊回傳鍵回傳到A,didChangeAppLifecycleState 不回呼
其實這個問題大部分人是想要實作類似于Android 中 onResume 中的功能,用 didChangeAppLifecycleState 是無法實作此功能的,didChangeAppLifecycleState 是對應于整個應用程式的,而不是 Flutter 中 不同的路由(頁面),
從A->B,在從B回傳A,A重新加載資料使用如下方法:
A頁面代碼:
class A extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(onPressed: ()async{
var result = await Navigator.of(context).push(MaterialPageRoute(builder: (context){
return B();
}));
//從B回傳到A時,執行下面的代碼
//TODO 加載資料
});
}
}
B頁面代碼:
class B extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(onPressed: (){
Navigator.of(context).pop('回傳的引數');
});
}
}
交流
老孟Flutter博客(330個控制元件用法+實戰入門系列文章):http://laomengit.com
歡迎加入Flutter交流群(微信:laomengit)、關注公眾號【老孟Flutter】:
![]() |
![]() |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245021.html
標籤:Dart


