IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter State 的生命周期 -> 正文阅读

[移动开发]Flutter State 的生命周期

本文主要介绍类比 Android 和 iOS,了解 Flutter State 的生命周期。

从 Android 或 iOS 转到 Flutter 开发,最让人疑惑的是 Flutter 如何处理生命周期。

onCreate() 在哪里?viewDidLoad() 呢?我应该将业务逻辑放在哪里?为什么只有一个 build 方法?

本文将解答这些疑惑。

Android

Activity 生命周期是 Android 开发必须记住的:

  • onCreate
  • onStart
  • onResume

  • onPause
  • onStop
  • onRestart
  • onDestroy

大部分业务逻辑放在 onCreate 方法:初始化 view、数据库、监听器等等。onResumeonPause 是判断用户离开或进入当前页面的好时机。

iOS

UIViewController 的生命周期如下:

  • viewDidLoad
  • viewWillAppear
  • viewDidAppear

  • viewWillDisappear
  • viewDidDisappear
  • viewDidUnload

如你所见,两个平台均使用几乎一致的步骤来创建或销毁页面。大部分业务逻辑放在 viewDidLoad(),而 Will/Did Appear/Disappear 用于保存信息,判断用户何时离开页面等等。

Flutter

在 Flutter 中呢?Widget 也遵循类似规则吗?

Flutter 中主要有两种 Widget:StatelessWidgetStatefulWidget。本文重点放在 StatefulWidget,因为它有点像 AndroidiOS 中的某些概念。

StatefulWidget

StatefulWidget 是最重要的 Widget,因为它持有 State,它知道何时发生变化并进行必要的重绘。它的生命周期如下:

  • createState
  • initState
  • didChangeDependencies
  • build
  • (didUpdateWidget)

— — — — — — — — — — —

  • deactivate
  • dispose

你可能会注意到创建阶段的 state 比销毁阶段的多,这是因为创建/重建 Widget 及其 State 更复杂。

createState():

构建新的 StatefulWidget 时将调用 createState(),StatefulWidget 的子类必须覆盖这个方法:

class MyScreen extends StatefulWidget {
  @override
  _MyScreenState createState() => _MyScreenState();
}

initState()

通常需要重写这个方法。它是 Widget 创建后调用的第一个方法,可以理解成 onCreate()viewDidLoad() 的等价物。在这个方法中可以检查 Widget 某些相关属性:是否有被渲染?当前是否处理 mounted 状态?

mounted

每个 Widget 都有这个属性。当为 Widget.buildContext 赋值后 mounted 的值变成 true,Widget 在树中。直到 dispose 方法被调用前,mounted 一直为 true。

addPostFrameCallback

可以在 initState 方法中按如下方式调用 addPostFrameCallback

import 'package:flutter/scheduler.dart';
@override
void initState() {
  super.initState();
  SchedulerBinding.instance.addPostFrameCallback((_) => {});
}

这个方法为一帧结束时添加回调,回调方法只会调用一次,通知 Widget 构建已完成。

didChangeDependencies

widget 构建时第一次调用 initState() 后立即会调用 didChangeDependencies()。如果 StatefulWidgets 依赖某个 InheritedWidget,后者发生变化时会导致 didChangeDependencies() 再次被调用。

build()

可以肯定地说这是最重要的方法。这个方法依赖整个待渲染的 Widget 树,在 didChangeDependencies() 立即被调用。所有的 GUI 渲染发生在这个方法,每次 UI 需要重新渲染时都会调用这个方法。(重新渲染是很廉价的操作)

didUpdateWidget()

这是一个不太常见的生命周期方法。一旦 parent widget 有变化需要重绘 UI 时会调用 didUpdateWidget()。这个方法有一个 oldWidget 参数,可以将它跟当前 widget 进行比较以执行某些额外的业务逻辑。

deactivate()

这个生命周期方法也不太常见。这个方法被调用时,意味着 Widget 开始进入”死亡”阶段。

当 framework 从树中移除 State 时会调用本方法。某些情况下,framework 会重新将 State 对象加入到树中。

dispose()

这个方法也非常重要。当 Widget 及其 State 从树中永久移除时会调用这个方法。此后 Widget 不会再被构建。

你需要在这个方法中做取消对 stream 的监听、销毁动画等操作。它是 initState 的反操作。

WidgetsBindingObserver

如果我们想监听应用何时进入后台该怎么办?

可以这样做。对 StatefulWidget 做些小改动:

class _MyScreenState extends State<MyScreen> with WidgetsBindingObserver

我们让 _MyScreenState 实现了抽象类 WidgetsBindingObserver,之后就可以观察应用的生命周期状态。在 initState 方法中开始观察:

WidgetsBinding.instance.addObserver(this);

dispose 方法中停止观察:

WidgetsBinding.instance.removeObserver(this);

接下来在 didChangeAppLifecycleState 接收生命周期的变化即可:

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  super.didChangeAppLifecycleState(state);
  if (state == AppLifecycleState.paused) {
    // went to Background
  }
  if (state == AppLifecycleState.resumed) {
    // came back to Foreground
  }
}

这个技巧很有用。如果你想在应用进入后台时弹出 notification,或者保存数据,又或者在用户点 back 回退时弹出 popup,都可以使用这个技巧。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章           查看所有文章
加:2021-08-14 14:11:29  更:2021-08-14 14:14:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 11:05:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码