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