State 初始化時會依次執行 :構造方法 -> initState -> didChangeDependencies -> build,隨後完成頁面渲染。安全
Widget 的狀態更新,主要由 3 個方法觸發:setState、didchangeDependencies 與 didUpdateWidget。async
一旦這三個方法被調用,Flutter 隨後就會銷燬老 Widget,並調用 build 方法重建 Widget。函數
好比組件被移除,或是頁面銷燬的時候,系統會調用 deactivate 和 dispose 這兩個方法,來移除或銷燬組件。oop
在原生開發中,咱們能夠經過重寫 Activity、ViewController 生命週期回調方法,或是註冊應用程序的相關通知,來監聽 App 的生命週期並作相應的處理。而在 Flutter 中,咱們能夠利用 WidgetsBindingObserver 類,來實現一樣的需求。post
abstract class WidgetsBindingObserver {
//頁面pop
Future<bool> didPopRoute() => Future<bool>.value(false);
//頁面push
Future<bool> didPushRoute(String route) => Future<bool>.value(false);
//系統窗口相關改變回調,如旋轉
void didChangeMetrics() { }
//文本縮放係數變化
void didChangeTextScaleFactor() { }
//系統亮度變化
void didChangePlatformBrightness() { }
//本地化語言變化
void didChangeLocales(List<Locale> locale) { }
//App生命週期變化
void didChangeAppLifecycleState(AppLifecycleState state) { }
//內存警告回調
void didHaveMemoryPressure() { }
//Accessibility相關特性回調
void didChangeAccessibilityFeatures() {}
}
複製代碼
在組件渲染以後作一些與顯示安全相關的操做。ui
在 iOS 開發中,咱們能夠經過 dispatch_async(dispatch_get_main_queue(),^{…}) 方法,讓操做在下一個 RunLoop 執行;spa
在 Android 開發中,咱們能夠經過 View.post() 插入消息隊列,來保證在組件渲染後進行相關操做。code
WidgetsBinding.instance.addPostFrameCallback((_){
print("單次Frame繪製回調");//只回調一次
});
複製代碼
WidgetsBinding.instance.addPersistentFrameCallback((_){
print("實時Frame繪製回調");//每幀都回調
});
複製代碼
State的變化,則會觸發build,重建Widget。好比Widget A打開新的Widget B,Widget A的State發生變化。orm