Flutter鸿蒙next 刷新机制的高级使用【衍生详解】
✅近期推荐:求职神器
https://bbs.csdn.net/topics/619384540
🔥欢迎大家订阅系列专栏:flutter_鸿蒙next
💬淼学派语录:只有不断的否认自己和肯定自己,才能走出弯曲不平的泥泞路,因为平坦的大路,太tm无趣了!
目录
写在前面
1. Flutter 刷新机制概述
2. Widget 刷新的种类
2.1 StatelessWidget
2.2 StatefulWidget
2.3 InheritedWidget
3. 使用 setState 的最佳实践
3.1 精简 setState 的使用
3.2 延迟执行
4. Widget 树的高效更新
4.1 使用 const 构造函数
4.2 ValueNotifier 和 ValueListenableBuilder
5. 使用 InheritedWidget 共享状态
5.1 创建自定义的 InheritedWidget
5.2 使用自定义的 InheritedWidget
6. 高级状态管理解决方案
7. 性能优化技巧
7.1 减少 Widget 重建
7.2 使用 LayoutBuilder
7.3 使用 AnimatedBuilder
写在最后
写在前面
Flutter 是一个强大的 UI 框架,旨在高效地构建优美的用户界面。其刷新机制是 Flutter 性能的关键因素之一。理解 Flutter 的刷新机制不仅能帮助你优化应用性能,还能提升用户体验。本文将深入探讨 Flutter 的刷新机制,包括状态管理、重建、性能优化和一些高级使用技巧。
1. Flutter 刷新机制概述
在 Flutter 中,刷新机制主要围绕 StatefulWidget
和 StatelessWidget
的重建而展开。每当状态变化或依赖的对象发生变化时,Flutter 会决定何时重建 Widgets。这个过程通常包括以下几个步骤:
- 调用
setState
:当你调用setState
方法时,Flutter 会标记当前的状态为“脏”。 - 调度构建:标记为“脏”的状态会被加入到 Flutter 的构建队列中,等待下一帧的渲染。
- 调用
build
方法:Flutter 会重新调用与标记的状态关联的build
方法来生成新的 Widget 树。 - 比较 Widget 树:Flutter 通过 Widget 树的差异(Diffing)来确定哪些部分需要更新,从而最小化重建的 Widget。
- 渲染更新:最终,只有需要更新的部分会被渲染到屏幕上。
2. Widget 刷新的种类
2.1 StatelessWidget
- 描述:
StatelessWidget
是不可变的,每当需要更新 UI 时,整个 Widget 会被重建。 - 使用场景:适合用来构建静态内容或数据不会变化的场景。
2.2 StatefulWidget
- 描述:
StatefulWidget
是可变的,能够在 Widget 生命周期内保存状态。当状态变化时,可以通过setState
方法更新 UI。 - 使用场景:适合需要交互或动态数据变化的场景。
2.3 InheritedWidget
- 描述:
InheritedWidget
用于在 Widget 树中共享数据。子 Widget 可以订阅它的变化,从而在数据变化时重新构建。 - 使用场景:适合需要跨多个 Widget 共享状态的场景。
3. 使用 setState
的最佳实践
3.1 精简 setState
的使用
使用 setState
时,应尽量只更新需要变化的部分。避免在 setState
中执行复杂的逻辑或多次更新,这会导致不必要的重建。
void _updateCounter() {setState(() {_counter++; // 只更新计数器的值});
}
3.2 延迟执行
在需要进行多个状态更新时,可以使用 Future.microtask
或 SchedulerBinding.instance.addPostFrameCallback
延迟更新 UI,确保不会重复调用 setState
。
void _delayedUpdate() {Future.microtask(() {setState(() {// 更新多个状态});});
}
4. Widget 树的高效更新
4.1 使用 const
构造函数
通过使用 const
构造函数来创建不可变的 Widget,Flutter 可以更高效地重用这些 Widget,减少重新构建的次数。
const Text('Hello, World!'); // 这个 Widget 是不可变的
4.2 ValueNotifier
和 ValueListenableBuilder
使用 ValueNotifier
和 ValueListenableBuilder
可以简化状态管理,只在相关值变化时更新 UI,而不是整个 Widget。
class Counter {ValueNotifier<int> count = ValueNotifier<int>(0);void increment() {count.value++;}
}// 在 UI 中使用
ValueListenableBuilder<int>(valueListenable: counter.count,builder: (context, value, child) {return Text('Count: $value');},
);
5. 使用 InheritedWidget
共享状态
InheritedWidget
是 Flutter 中一种强大的状态管理方式,可以在 Widget 树中共享数据。当状态变化时,所有依赖该状态的子 Widget 都会自动更新。
5.1 创建自定义的 InheritedWidget
class MyInheritedWidget extends InheritedWidget {final int data;MyInheritedWidget({required this.data, required Widget child}) : super(child: child);static MyInheritedWidget? of(BuildContext context) {return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();}@overridebool updateShouldNotify(MyInheritedWidget oldWidget) {return oldWidget.data != data; // 判断是否需要更新}
}
5.2 使用自定义的 InheritedWidget
在子 Widget 中,可以使用 MyInheritedWidget.of(context)
来访问共享的数据:
@override
Widget build(BuildContext context) {final inheritedData = MyInheritedWidget.of(context)!.data;return Text('Inherited Data: $inheritedData');
}
6. 高级状态管理解决方案
对于更复杂的应用,可能需要使用一些状态管理库来处理 Widget 刷新,例如:
- Provider: 轻量级的状态管理库,基于
InheritedWidget
,易于使用且灵活。 - Bloc: 基于流的状态管理,适合处理复杂的业务逻辑。
- Riverpod: 提供更强大的功能与可组合性,适用于各种类型的 Flutter 应用。
7. 性能优化技巧
7.1 减少 Widget 重建
- 使用
const
: 对于静态内容,使用const
构造函数,避免不必要的重建。 - 使用
RepaintBoundary
: 将需要频繁更新的 Widget 与不需要更新的部分分离,可以提升性能。
7.2 使用 LayoutBuilder
使用 LayoutBuilder
可以根据父 Widget 的约束条件来决定如何构建子 Widget,优化布局性能。
7.3 使用 AnimatedBuilder
对于动画效果,使用 AnimatedBuilder
可以提高性能,因为它只重建依赖于动画的部分。
AnimatedBuilder(animation: _controller,builder: (context, child) {return Transform.scale(scale: _controller.value,child: child,);},child: const Icon(Icons.star),
);
写在最后
理解 Flutter 的刷新机制和高效使用状态管理是提升应用性能的关键。通过精确地控制状态变化、减少不必要的重建和使用合适的状态管理解决方案,可以让你的应用在性能上表现得更加出色。希望本文能帮助你更好地理解 Flutter 的刷新机制,提升你的开发技巧!
相关文章:
Flutter鸿蒙next 刷新机制的高级使用【衍生详解】
✅近期推荐:求职神器 https://bbs.csdn.net/topics/619384540 🔥欢迎大家订阅系列专栏:flutter_鸿蒙next 💬淼学派语录:只有不断的否认自己和肯定自己,才能走出弯曲不平的泥泞路,因为平坦的大路…...
c/c++--静态变量和静态函数(static)
目录 1 c静态函数和静态变量 1.1 C静态成员函数: 1.1.1定义与基本语法 1.1.2 不依赖于实例 1.1.3 访问限制 1.1.4共享数据 1.1.5 作用域与命名 1.1.6 工厂函数和工厂方法(常用途) 1.2 c静态函数() 1.3c静态变量 …...

Windows系统启动MongoDB报错无法连接服务器
文章目录 发现问题解决办法 发现问题 1)、先是发现执行 mongo 命令,启动报错: error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017; 2)、再检查 MongoDB 进程 tasklist | findstr mongo 发现没有进程&a…...

Linux的makefile与进度条小程序实践
makefile make命令主要功能使用方法常用选项 makefile文件基本结构使用案例变量定义内置变量(即系统定义的确定变量)伪目标模式规则条件语句注释makefile中的常用函数 进度条小程序创建文件编辑.h文件编辑.c文件创建main函数makefile文件执行效果 make命令 在linux中ÿ…...
latex写作基础
参考:https://www.bilibili.com/video/BV1ku4y1X7Rz 在线latex:https://cn.overleaf.com/ tex文件基本结构 \documentclass{article} % 文档类型,%是注释\usepackage{graphicx} % 导入各种包,这里是graphicx包\titl…...
Chromium HTML5 新的 Input 类型email对应c++
一、Input 类型: email email 类型用于应该包含 e-mail 地址的输入域。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…...

嵌入式Linux的AXI平台(platform)驱动教程
本文以JFMQL100的Linux系统的AXI接口的平台驱动为例,介绍嵌入式Linux的平台驱动编写、测试软件编写以及验证方式。本文的方法适用于任意嵌入式芯片Linux的物理地址映射的平台(platform)驱动的编写、测试与应用。 本文中AXI的开始地址为0x8000…...
什么是Java策略模式?与Spring的完美结合
文章目录 什么是策略模式?策略模式的组成部分: 策略模式的示例在Spring中的妙用1. 使用Spring配置2. 在上下文中选择策略3. 动态切换策略 总结推荐阅读文章 在软件设计中,策略模式是一种非常常见的设计模式,它能够让算法的变化独立…...
[Go实战]:HTTP请求转发
前言 在Web应用开发中,请求转发是一项核心且常见的功能,用于负载均衡、服务拆分、路由重定向和业务逻辑处理。通过在Go语言中封装一个通用的HTTP请求转发方法,我们可以简化代码结构,提升可读性、可维护性和可扩展性。本文将探讨如…...

【C++单调栈 贡献法】907. 子数组的最小值之和|1975
本文涉及的基础知识点 C单调栈 LeetCode907. 子数组的最小值之和 给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。 由于答案可能很大,因此 返回答案模 109 7 。 示例 1&#x…...
极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【二】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...

Django 5 增删改查 小练习
1. 用命令创建目录和框架 django-admin startproject myapp cd myapp py manage.py startapp app md templates md static md media 2. Ai 生成代码 一、app/models.py from django.db import modelsclass Product(models.Model):name models.CharField(max_length255, verb…...

【STM32 Blue Pill编程实例】-I2C主从机通信(中断、DMA)
I2C主从机通信(中断、DMA) 文章目录 I2C主从机通信(中断、DMA)1、STM32的I2C介绍2、I2C模式3、STM32 I2C 数据包错误检查4、STM32 I2C 错误情况5、STM32 I2C中断6、STM32 I2C 主发送和接收(Tx 和 RX)6.1 I2C 轮询模式6.2 I2C 中断模式6.3 I2C DMA 模式6.4 STM32 I2C 设备…...

基于SSM+小程序的旅游社交登录管理系统(旅游4)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理&a…...
高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?
如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收器? 我回答: 1. Serial收集器 特点:Serial收集器是最古老、最稳定的收集器,它使用单个线程进行垃圾收集工作。在进行垃圾回收时,它会暂停所有用户线程,即St…...

Java-内部类
个人主页 学习内部类(Inner Class)是Java编程中一项重要且强大的特性,它允许你在一个类的内部定义另一个类。内部类提供了一种将逻辑上相关的类组织在一起的方式,增加了代码的封装性和可读性。接下来带领大家进入內部类的学习。 …...
flutter集成极光推送
一、简述 极光推送,英文简称 JPush,免费的第三方消息推送服务,官方也推出众多平台的SDK以及插件。 参考链接 名称地址客户端集成插件客户端集成插件 - 极光文档 二、操作步骤 2.1 添加插件 flutter项目中集成官方提供的 极光推送flutte…...

D. Skipping 【 Codeforces Round 980 (Div. 2)】
D. Skipping 思路: 注意到最佳策略是先往右跳转到某处,然后按顺序从右往左把没有遇到过的题目全部提交。 将从 i i i跳转到 b [ i ] b[i] b[i]视为通过边权(代价)为 a [ i ] a[i] a[i]的路径,而向左的路径边权都是 0 0 0;目的是找到到从出发…...
【golang】学习文档整理
Binding | Echo 传值时注意零值和传空的区别 需要validate require 和 设置指针配合使用 保证不同值的返回不同 不能客户端传0值被判断为空 测试时要空值零值去测试字段是否正确返回 返回错误是否符合预期...

动态规划-子序列问题——1218.最长定差子序列
1.题目解析 题目来源:1218.最长定差子序列——力扣 测试用例 2.算法原理 1.状态表示 本题可以看作是寻找一个等差序列,并且公差给出,这里并不是普通的使用一个dp表,而是将arr与dp表同时存储于一个哈希表,arr[i]映射dp…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...