当前位置: 首页 > news >正文

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 中,刷新机制主要围绕 StatefulWidgetStatelessWidget 的重建而展开。每当状态变化或依赖的对象发生变化时,Flutter 会决定何时重建 Widgets。这个过程通常包括以下几个步骤:

  1. 调用 setState:当你调用 setState 方法时,Flutter 会标记当前的状态为“脏”。
  2. 调度构建:标记为“脏”的状态会被加入到 Flutter 的构建队列中,等待下一帧的渲染。
  3. 调用 build 方法:Flutter 会重新调用与标记的状态关联的 build 方法来生成新的 Widget 树。
  4. 比较 Widget 树:Flutter 通过 Widget 树的差异(Diffing)来确定哪些部分需要更新,从而最小化重建的 Widget。
  5. 渲染更新:最终,只有需要更新的部分会被渲染到屏幕上。

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.microtaskSchedulerBinding.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

使用 ValueNotifierValueListenableBuilder 可以简化状态管理,只在相关值变化时更新 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 刷新机制的高级使用【衍生详解】

✅近期推荐&#xff1a;求职神器 https://bbs.csdn.net/topics/619384540 &#x1f525;欢迎大家订阅系列专栏&#xff1a;flutter_鸿蒙next &#x1f4ac;淼学派语录&#xff1a;只有不断的否认自己和肯定自己&#xff0c;才能走出弯曲不平的泥泞路&#xff0c;因为平坦的大路…...

c/c++--静态变量和静态函数(static)

目录 1 c静态函数和静态变量 1.1 C静态成员函数&#xff1a; 1.1.1定义与基本语法 1.1.2 不依赖于实例 1.1.3 访问限制 1.1.4共享数据 1.1.5 作用域与命名 1.1.6 工厂函数和工厂方法&#xff08;常用途&#xff09; ​​​1.2 c静态函数&#xff08;) 1.3c静态变量 …...

Windows系统启动MongoDB报错无法连接服务器

文章目录 发现问题解决办法 发现问题 1&#xff09;、先是发现执行 mongo 命令&#xff0c;启动报错&#xff1a; error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017&#xff1b; 2&#xff09;、再检查 MongoDB 进程 tasklist | findstr mongo 发现没有进程&a…...

Linux的makefile与进度条小程序实践

makefile make命令主要功能使用方法常用选项 makefile文件基本结构使用案例变量定义内置变量(即系统定义的确定变量)伪目标模式规则条件语句注释makefile中的常用函数 进度条小程序创建文件编辑.h文件编辑.c文件创建main函数makefile文件执行效果 make命令 在linux中&#xff…...

latex写作基础

参考&#xff1a;https://www.bilibili.com/video/BV1ku4y1X7Rz 在线latex&#xff1a;https://cn.overleaf.com/ tex文件基本结构 \documentclass{article} % 文档类型&#xff0c;&#xff05;是注释\usepackage{graphicx} % 导入各种包&#xff0c;这里是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接口的平台驱动为例&#xff0c;介绍嵌入式Linux的平台驱动编写、测试软件编写以及验证方式。本文的方法适用于任意嵌入式芯片Linux的物理地址映射的平台&#xff08;platform&#xff09;驱动的编写、测试与应用。 本文中AXI的开始地址为0x8000…...

什么是Java策略模式?与Spring的完美结合

文章目录 什么是策略模式&#xff1f;策略模式的组成部分&#xff1a; 策略模式的示例在Spring中的妙用1. 使用Spring配置2. 在上下文中选择策略3. 动态切换策略 总结推荐阅读文章 在软件设计中&#xff0c;策略模式是一种非常常见的设计模式&#xff0c;它能够让算法的变化独立…...

[Go实战]:HTTP请求转发

前言 在Web应用开发中&#xff0c;请求转发是一项核心且常见的功能&#xff0c;用于负载均衡、服务拆分、路由重定向和业务逻辑处理。通过在Go语言中封装一个通用的HTTP请求转发方法&#xff0c;我们可以简化代码结构&#xff0c;提升可读性、可维护性和可扩展性。本文将探讨如…...

【C++单调栈 贡献法】907. 子数组的最小值之和|1975

本文涉及的基础知识点 C单调栈 LeetCode907. 子数组的最小值之和 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff0c;因此 返回答案模 109 7 。 示例 1&#x…...

极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐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)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 本旅游社交小程序功能有管理员和用户。管理员有个人中心&#xff0c;用户管理&#xff0c;每日签到管理&#xff0c;景点推荐管理&#xff0c;景点分类管理&#xff0c;防疫查询管理&a…...

高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?

如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收器? 我回答: 1. Serial收集器 特点&#xff1a;Serial收集器是最古老、最稳定的收集器&#xff0c;它使用单个线程进行垃圾收集工作。在进行垃圾回收时&#xff0c;它会暂停所有用户线程&#xff0c;即St…...

Java-内部类

个人主页 学习内部类&#xff08;Inner Class&#xff09;是Java编程中一项重要且强大的特性&#xff0c;它允许你在一个类的内部定义另一个类。内部类提供了一种将逻辑上相关的类组织在一起的方式&#xff0c;增加了代码的封装性和可读性。接下来带领大家进入內部类的学习。 …...

flutter集成极光推送

一、简述 极光推送&#xff0c;英文简称 JPush&#xff0c;免费的第三方消息推送服务&#xff0c;官方也推出众多平台的SDK以及插件。 参考链接 名称地址客户端集成插件客户端集成插件 - 极光文档 二、操作步骤 2.1 添加插件 flutter项目中集成官方提供的 极光推送flutte…...

D. Skipping 【 Codeforces Round 980 (Div. 2)】

D. Skipping 思路: 注意到最佳策略是先往右跳转到某处&#xff0c;然后按顺序从右往左把没有遇到过的题目全部提交。 将从 i i i跳转到 b [ i ] b[i] b[i]视为通过边权(代价)为 a [ i ] a[i] a[i]的路径&#xff0c;而向左的路径边权都是 0 0 0&#xff1b;目的是找到到从出发…...

【golang】学习文档整理

Binding | Echo 传值时注意零值和传空的区别 需要validate require 和 设置指针配合使用 保证不同值的返回不同 不能客户端传0值被判断为空 测试时要空值零值去测试字段是否正确返回 返回错误是否符合预期...

动态规划-子序列问题——1218.最长定差子序列

1.题目解析 题目来源&#xff1a;1218.最长定差子序列——力扣 测试用例 2.算法原理 1.状态表示 本题可以看作是寻找一个等差序列&#xff0c;并且公差给出&#xff0c;这里并不是普通的使用一个dp表&#xff0c;而是将arr与dp表同时存储于一个哈希表&#xff0c;arr[i]映射dp…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...