State 的生命週期,定義了 Widget 的加載到構建的全過程,能夠利用其回調機制根據 Widget 的狀態選擇合適的時機作合適的事情。而 APP 的生命週期,則定義了 APP 從啓動到退出的全過程ide
若是想在對應的 APP 的生命週期事件中作相應的處理,好比 APP 從後臺進入前臺、從前臺退到後臺,或是在 UI 繪製完後作一些處理,則能夠應用 WidgetsBindingObserver 類來實現this
// Accessibility 相關特性回調 void didChangeAccessibilityFeatures() { } // App 生命週期改變回調 void didChangeAppLifecycleState(AppLifecycleState state) { } // 本地化語言改變回調 void didChangeLocales(List<Locale> locale) { } // 系統窗口相關改變回調 void didChangeMetrics() { } // 系統亮度改變回調 void didChangePlatformBrightness() { } // 文本縮放係數改變回調 void didChangeTextScaleFactor() { } // 內存不足警告回調 void didHaveMemoryPressure() { } // 頁面 pop Future<bool> didPopRoute() => Future<bool>.value(false); // 頁面 push Future<bool> didPushRoute(String route) => Future<bool>.value(false);
要使用以上回調方法,只需經過給 WidgetsBindingObserver 單例對象設置監聽器便可監聽相關回調方法線程
didChangeAppLifecycleState 回調方法中,有一個參數類型爲 AppLifecycleState 的枚舉類,這個枚舉類是 Flutter 對 App 生命週期狀態的封裝,經常使用的狀態包括 inactive、paused、resumedcode
class AppLifecycleReactor extends StatefulWidget { const AppLifecycleReactor({ Key key }) : super(key: key); @override _AppLifecycleReactorState createState() => _AppLifecycleReactorState(); } class _AppLifecycleReactorState extends State<AppLifecycleReactor> with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this);// 註冊監聽器 } @override void dispose() { WidgetsBinding.instance.removeObserver(this);// 移除監聽器 super.dispose(); } AppLifecycleState _notification; @override void didChangeAppLifecycleState(AppLifecycleState state) { print("$state"); } }
能夠試着切換下先後臺,觀察下控制檯輸出的 App 狀態orm
有時除了須要監聽 App 的生命週期回調外,還須要在組件完成渲染後作一些與顯示相關的其餘處理,好比切換線程等,此時能夠使用 WidgetsBinding 來實現server
WidgetsBinding 提供了單次 Frame 繪製回調及實時 Frame 繪製回調兩種機制對象
WidgetsBindingObserver.instance.addPostFrameCallback((_){ print("addPostFrameCallback 繪製回調"); // 只回調一次 });
WidgetsBindingObserver.instance.addPersistentFrameCallback((_){ print("addPersistentFrameCallback 繪製回調"); // 每幀都回調 });