赞
踩
Flutter 应用的生命周期涉及两个层面:Widget(组件)的生命周期 和 应用程序(App)的生命周期。下面分别对这两个方面进行详细介绍:
Flutter 中的 Widget 是构成用户界面的基本单元,分为无状态(StatelessWidget
)和有状态(StatefulWidget
)两种类型。它们各自具有相应的生命周期回调方法:
build(BuildContext context)
:这是无状态组件唯一的生命周期回调。每当父组件重建(例如,由于父组件状态改变导致子组件需要重新渲染)或应用程序全局配置(如主题、方向等)发生变化时,build()
方法会被调用。此方法负责根据提供的 BuildContext
返回一个新的 Widget
树。createState()
:当 StatefulWidget 被插入到 widget 树中时,Flutter 框架会调用这个方法来创建与其关联的 State
对象。
State
类的生命周期方法:
@override void initState()
:在 State
对象被创建并关联到 StatefulWidget
后立即调用。在此方法中可以进行一次性初始化操作,如设置监听器、初始化异步任务等,但不能直接访问 BuildContext
,因为此时 widget 尚未被构建到树中。
@override void didChangeDependencies()
:在 initState()
之后和首次 build()
之前调用。当依赖关系(如 InheritedWidget
)发生变化时也会调用。在此方法中可以处理依赖项变更,进行依赖数据的获取或刷新。
@override Widget build(BuildContext context)
:与无状态组件相同,每次需要重新构建 widget 树时都会调用此方法。这里根据 BuildContext
创建并返回 widget 树。
@override void setState(VoidCallback fn)
:调用此方法会标记 State
对象为“dirty”,触发 widget 树重新构建。fn
参数用于封装状态更改逻辑,这些更改将在下一次 build()
调用时生效。
@override void didUpdateWidget(Widget oldWidget)
:当关联的 StatefulWidget 实例发生更改但 State 对象保持不变时调用。可以在这里对比新旧 widget 实例,处理 widget 属性变化带来的影响。
@override void deactivate()
:当 widget 从视图树中暂时移除但其 State
仍可能被恢复时调用。可用于释放不需要的资源,但应避免在此处清理所有状态,因为 widget 可能很快重新激活。
@override void dispose()
:当 widget 从视图树中永久移除且不再需要其 State
时调用。在此方法中释放所有资源(如关闭监听器、取消订阅、清理大型对象等),确保没有内存泄漏。
Flutter 应用程序的生命周期主要由 main()
函数开始,直到应用程序终止。关键步骤包括:
void main() async { ... }
:
runApp(MyApp())
:
runApp()
函数将应用程序的根 widget(如 MyApp
,通常是一个 MaterialApp
或 WidgetsApp
)传递给 Flutter 框架。这标志着应用程序启动,Flutter 开始构建 widget 树并将其渲染到屏幕。WidgetsApp
或 MaterialApp
生命周期回调:
@override Widget build(BuildContext context)
:构建应用程序的主界面。didChangeMetrics
, didHaveMemoryPressure
, didChangeTextScaleFactor
, localeListResolutionCallback
, 等):响应系统事件和用户行为,如设备方向变化、内存压力、文本缩放因子更改、语言选择等。应用程序暂停与恢复:
deactivate()
方法,并暂停动画及其他非必要任务以节省资源。build()
方法,同时触发 didChangeDependencies()
和 reassemble()
(在热重载后)等方法。应用程序终止:
dispose()
方法会被调用,释放所有资源。此后,应用程序生命周期结束。综上所述,Flutter 的生命周期管理既包括组件级别的状态变化与资源管理,也涵盖应用程序级别的启动、暂停、恢复与终止过程。理解并恰当利用这些生命周期回调,对于编写高效、健壮且响应迅速的应用程序至关重要。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。