likes
comments
collection
share

Flutter应用程序的生命周期

作者站长头像
站长
· 阅读数 13

1.  main() 函数:

 这是应用程序的入口点,其中初始化了Flutter框架,并调用 runApp() 函数来启动应用程序。

2.   runApp():

 在 main() 函数中调用 runApp() 函数来启动应用程序。它会创建一个实例,并将其渲染到设备的屏幕上。(WidgetsApp 或 MaterialApp

3.  应用程序启动:

当应用程序启动时,会触发 WidgetsApp 或 MaterialApp 的生命周期回调方法。

didChangeAppLifecycleState:当应用程序的生命周期状态发生变化时调用,例如应用程序进入前台或后台。

didChangeAccessibilityFeatures:当设备的辅助功能设置发生变化时调用。

didChangeLocales:当设备的区域设置发生变化时调用。

onGenerateRoute:根据指定的路由生成页面的回调方法。

4.   build() 方法:

 在启动应用程序后,会调用 build() 方法来构建应用程序的用户界面。该方法通常返回一个 Widget,表示应用程序的根界面。

StatelessWidget的生命周期:

StatelessWidget是一种无状态的Widget,在Flutter中没有显式的生命周期方法。StatelessWidget的生命周期相对简单,只有一次构建过程。

当使用StatelessWidget构建一个Widget时,Flutter会调用该Widget的build()方法来构建UI。在这个过程中,Flutter会根据Widget的属性和父级Widget的状态来创建并返回Widget树。一旦构建完成,StatelessWidget的工作就完成了,它不会存储状态也不会发生变化。

每当需要更新StatelessWidget的UI时,Flutter会创建一个新的StatelessWidget实例,并重新调用其build()方法进行UI的重建。这意味着StatelessWidget是完全无状态的,它不会保留任何状态信息,也不会处理用户交互或触发更新。

简单来说,StatelessWidget的生命周期只包括一次构建过程,它只负责根据输入属性构建UI,不会存储状态或处理更新。因此,StatelessWidget适用于展示静态内容或只依赖于传入参数的情况,它们更加简单和轻量,也更高效地构建和渲染。

StatefulWidget生命周期:

Flutter框架会根据需要创建、更新和销毁小部件,并调用相应的生命周期方法。

(1)  createState:

用于创建一个widget状态对象(state object)。小部件(Widget)和状态对象(State)是分离的,小部件负责构建用户界面,而状态对象负责存储和管理与小部件相关的状态信息。

(2)  initState:

用于初始化一个状态对象(State object)。当widget的状态对象被创建时,都会调用该方法。

当widget被插入到widget树中时,Flutter框架会创建一个对应的状态对象,并调用该状态对象的 initState 方法。这个方法通常被重写,用于执行一些初始化操作,例如设置初始值、订阅事件或执行一次性的配置。

initState 方法只会被调用一次,即在widget被插入到widget树中时。

(3)  didChangeDependencies:

用于处理widget依赖关系的变化。当widget依赖的信息发生变化时,会调用该方法。

当一个widget首次构建时,或者其依赖的信息发生变化时(例如父级widget的状态发生变化),会调用widget的 didChangeDependencies 方法。这个方法通常被重写,用于执行与依赖关系变化相关的操作,例如更新数据、重新订阅流、调用接口等。

(4)  build:

当widget的状态发生变化、依赖关系发生变化或者父级widget请求重建时,Flutter框架会调用widget的 build 方法。这个方法是必须被重写的,用于返回一个 Widget 对象。会多次调用。

(5)  didUpdateWidget:

当一个widget的配置发生变化时,会调用该方法。

当widget被更新时,会调用widget的此方法。这个方法通常被重写,用于执行与更新相关的操作,例如更新状态、重新订阅流、刷新数据等。

didUpdateWidget 方法在首次构建widget时不会被调用,它只在widget配置发生变化时被调用。

widget的配置发生变化,指的是widget所接收的参数或属性发生了变化。这包括widget的构造函数参数、父级widget传递的数据、或者通过依赖关系更新的数据等。

当父级widget重新构建时,如果传递给子级widget的参数发生了变化,或者父级widget通过setState方法更新了状态,那么子级widget的配置就会发生变化。这时,Flutter框架会销毁旧的子级widget实例,并创建一个新的子级widget实例来替代它,同时调用新实例的build方法。

(6)  deactivate:

当widget件树中被移除时调用。它标志着widget即将被销毁,但可以在这个方法中执行一些清理工作。

当一个widget被从widget树中移除时,会调用widget的 deactivate 方法。这个方法通常被重写,用于释放资源、取消订阅、停止动画等清理操作。

要注意的是,deactivate 方法不一定会被立即调用。具体的调用时机可能取决于widget树的重建、路由的切换等因素。因此,不要在 deactivate 方法中假设widget立即被销毁。

通过使用 deactivate 方法,您可以在小部件被移除时执行一些清理工作,以释放资源、取消订阅、停止动画等。这样可以确保小部件在被销毁之前进行必要的清理操作,并提供更好的性能和资源管理。

(7)  dispose:

当widget被永久移除并销毁时调用。它标志着widget的生命周期结束,可以在这个方法中执行最终的清理工作。

当一个widget被永久移除并销毁时,Flutter框架会调用widget的 dispose 方法。这个方法通常被重写,用于释放资源、取消订阅、停止动画等最终的清理操作。

dispose 和 deactivate 是小部件在生命周期结束时的两个不同阶段。

deactivate 方法在widget从widget树中被移除时调用,标志着widget即将被销毁。在 deactivate 方法中,可以执行一些清理工作,例如释放资源、取消订阅、停止动画等。deactivate 方法通常在widget不再可见或不再被需要时调用,但具体的调用时机可能取决于widget树的重建、路由的切换等因素。

dispose 方法在widget被永久移除并销毁时调用,标志着widget的生命周期结束。在 dispose 方法中,可以执行最终的清理工作,例如释放资源、取消订阅、停止动画等。dispose 方法通常在小部件被销毁时调用,但具体的调用时机可能取决于小部件树的重建、路由的切换等因素。

需要注意的是,deactivate 方法可能会在 dispose 方法之前被调用。这是因为在widget从widget树中被移除时,它首先会被标记为不再活动(deactivate),然后才会被永久移除和销毁(dispose)。

5.  应用程序关闭: 

当应用程序关闭时,会触发相应的生命周期回调方法。

   - dispose:在应用程序关闭前,最后一个小部件被永久删除时调用,用于释放资源和取消订阅。

生命周期状态

mounted:表示 State 对象已插入到树中。

用于表示widget当前是否已经插入到小部件树中。

当一个widget被插入到widget树中时,它的 mounted 属性会被设置为 true。当widget被永久移除并销毁时,它的 mounted 属性会被设置为 false。

mounted 属性通常用于检查widget是否仍然存在于widget树中。在某些情况下,当异步操作或回调函数触发时,widget可能已经被移除,但回调函数仍然被调用。在这种情况下,通过检查 mounted 属性可以避免对已经被移除的widget进行无效操作。

unmounted:表示 State 对象已被永久从树中移除。

应用程序生命周期

onResume:当应用程序从后台进入前台时调用。

onPause:当应用程序从前台进入后台时调用。

onLaunch:当应用程序被启动时调用。

onTerminate:当应用程序被终止时调用。注意,此方法不会在 iOS 上被调用,因为 iOS 不允许应用程序自我终止。

以上就是 Flutter 应用程序的生命周期。理解这些生命周期可以帮助开发人员编写更好的 Flutter 应用程序,并在应用程序的不同阶段执行必要的操作。

flutter 如何监听命周期状态发生:

在Flutter中,可以通过WidgetsBindingObserver接口来监听应用程序的生命周期状态的变化。WidgetsBindingObserver是一个观察者接口,它定义了一组回调方法,可以在应用程序的生命周期状态发生变化时进行相应的处理。

//1 在需要监听生命周期的Widget中实现WidgetsBindingObserver接口。例如,你可以在State对象中实现它:

class MyWidgetState extends State with WidgetsBindingObserver {

// ...

}

//2 在State对象中重写didChangeAppLifecycleState方法。该方法会在应用程序的生命周期状态发生变化时被调用,它接收一个AppLifecycleState枚举类型的参数,表示当前的生命周期状态。

class MyWidgetState extends State with WidgetsBindingObserver {

@override

void didChangeAppLifecycleState(AppLifecycleState state) {

// 在这里处理生命周期状态的变化

if (state == AppLifecycleState.resumed) {

// 应用程序从后台恢复到前台

} else if (state == AppLifecycleState.paused) {

// 应用程序从前台进入后台

}

}

}

//3 在State对象的初始化方法(如initState())中注WidgetsBindingObserver

class MyWidgetState extends State with WidgetsBindingObserver {

@override

void initState() {

super.initState();

WidgetsBinding.instance.addObserver(this);

}

// ...

}

//4 在State对象的销毁方法(如dispose())中注销WidgetsBindingObserver。

dart

class MyWidgetState extends State with WidgetsBindingObserver {

@override

void dispose() {

WidgetsBinding.instance.removeObserver(this);

super.dispose();

}

// ...

}

onGenerateRoute 路由管理

onGenerateRoute是一个可选的回调函数,它可以在Flutter应用程序中用来动态生成路由(routes)的回调函数。当导航器(Navigator)无法找到与指定路由名称相匹配的路由时,会调用onGenerateRoute来生成相应的路由。通常,onGenerateRoute函数用于实现动态路由,即根据路由名称和参数生成相应的路由。它常用于处理未知路由、动态路由、路由传参等情况。

MaterialApp(

// ... 其他配置

  onGenerateRoute: (settings) {

if (settings.name == '/profile') {

// 生成名为'/profile'的路由

return MaterialPageRoute(

        builder: (context) => ProfileScreen(),

);

} else if (settings.name == '/settings') {

// 生成名为'/settings'的路由

return MaterialPageRoute(

        builder: (context) => SettingsScreen(),

);

}

// 其他未知路由,可以返回一个默认的路由或错误页面

return MaterialPageRoute(

      builder: (context) => UnknownRouteScreen(),

);

},

);

// 使用
Navigator.pushNamed(context, '/profile');
转载自:https://juejin.cn/post/7240833613356367931
评论
请登录