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 的刷新机制,提升你的开发技巧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RN的 Button 组件没有 style 属性

在 React Native (RN) 中&#xff0c;Button 组件确实没有直接的 style 属性&#xff0c;这与一些其他的 React Native 组件&#xff08;如 View 或 Text&#xff09;有所不同。React Native 的 Button 组件是一个较为高级的封装&#xff0c;它提供了一些基本的样式和行为&…

索引的使用以及使用索引优化sql

索引就是一种快速查询和检索数据的数据结构&#xff0c;mysql中的索引结构有&#xff1a;B树和Hash。 索引的作用就相当于目录的作用&#xff0c;我么只需先去目录里面查找字的位置&#xff0c;然后回家诶翻到那一页就行了&#xff0c;这样查找非常快&#xff0c; 一、索引的使…

[Linux网络编程]06-I/O多路复用策略---select,poll分析解释,优缺点,实现IO多路复用服务器

一.I/O多路复用 I/O多路复用是一种用于提高系统性能的 I/O 处理机制。 它允许一个进程&#xff08;或线程&#xff09;同时监视多个文件描述符&#xff08;可以是套接字、管道、终端设备等&#xff09;&#xff0c;等待这些文件描述符中出现读、写或异常状态。一旦有满足条件的…

python爬虫基础篇:文本操作和二进制存储

文本操作 读取方式r readw writea appendb btye 合并方式 text.txt文件写入 lll aaa hhh wywywywywywy 读取文件方式&#xff1a;open&#xff08;“文件名”&#xff0c;读取方式&#xff0c;编码方式&#xff09; # ("读取文件名字"&#xff0c;读取方式&#xff0…

ts:类的创建(class)

ts&#xff1a;类的创建&#xff08;class&#xff09; 一、主要内容说明二、例子class类的创建1.源码1 &#xff08;class类的创建&#xff09;2.源码1的运行效果 三、结语四、定位日期 一、主要内容说明 class创建类里主要有三部分组成&#xff0c;变量的声明&#xff0c;构…

ts:数组的常用方法(filter)

ts&#xff1a;数组的常用方法&#xff08;filter&#xff09; 一、主要内容说明二、例子filter方法&#xff08;过滤&#xff09;1.源码1 &#xff08;push方法&#xff09;2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 ts中数组的filter方法&#xff0c;是筛选数…

停止等待协议、回退N帧协议、选择重传协议

停止等待协议、回退N帧协议、选择重传协议的内容、功能特点以及它们之间的区别&#xff1a; 一、停止等待协议 内容&#xff1a; 停止等待协议是最简单但也是最基础的数据链路层协议。该协议规定&#xff0c;发送方每发送一个数据分组后&#xff0c;就停止发送并等待接收方的…

自动化结账测试:使用 Playwright确保电商支付流程的无缝体验【nodejs]

使用 Playwright 掌握端到端结账测试 在电商领域&#xff0c;结账流程是用户体验中至关重要的一环。确保这一流程的稳定性和可靠性对于维护客户满意度和转化率至关重要。在本文中&#xff0c;我们将探讨如何使用 Playwright 进行端到端的结账测试&#xff0c;确保您的结账系统…

【STM32】单片机ADC原理详解及应用编程

本篇文章主要详细讲述单片机的ADC原理和编程应用&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、STM32ADC概述 1、ADC&#xff08;Analog-to-Digital Converter&#xff0c;模数转换器&#xff09; 2、STM32工作原理 二、STM32ADC编程实战 &#xff08;一&am…

【JAVA基础】什么是泛型? 什么是反射?

什么是泛型? 什么是反射? 什么是泛型?一 , 泛型 (Generics) 概述二 , 泛型的主要功能三 , 泛型的基本概念四 , 泛型的使用场景五 , 泛型的基本步骤六 , 泛型的优缺点七 , 示例代码 什么是反射?一 , 反射 (Reflection) 概述二 , 反射的主要功能1 . 获取类的信息2 . 创建对象…

oracle 行转列(PIVOT 多个行数据按照指定的列进行汇总) 列转行(UNPIVOT)

-- PIVOT是Oracle 11g版本引入的一个功能, 用来做行转列 -- as count1 as count2必须加上, 这样列名就没有引号了使用场景&#xff1a;PIVOT常用于数据透视、数据汇总和数据展示等场景&#xff0c;例如将多个行数据按照指定的列进行汇总&#xff0c;生成一条汇总数据&#xf…

如何对网络设备进行监控:以监控易平台为例

随着信息技术的飞速发展&#xff0c;运维行业正面临着前所未有的挑战。设备的多样性、复杂性以及业务需求的不断变化&#xff0c;都对运维团队提出了更高的要求。在这样的背景下&#xff0c;监控易平台应运而生&#xff0c;为运维团队提供了一种高效、全面的设备监控解决方案。…

java包的使用

在Java中&#xff0c;包&#xff08;package&#xff09;用于组织类和接口。它们提供了一种将相关的类和接口组织在一起的方式&#xff0c;使得代码更具可读性和可维护性。 要使用一个Java包&#xff0c;需要以下几个步骤&#xff1a; 在Java源代码文件的开头使用package关键字…

C++STL之stack

1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …

Web3.0技术入门

Web3.0技术入门是一个涉及多个方面和领域的复杂过程&#xff0c;以下是一些关键的步骤和要点&#xff0c;帮助您初步了解并掌握Web3.0技术。 一、了解Web3.0的基本概念 Web3.0也被称为下一代互联网&#xff0c;它是对当前互联网&#xff08;Web2.0&#xff09;的演进和升级。…

LeetCode 热题 100之普通数组

1.最大子数组和 思路分析&#xff1a;这个问题可以通过动态规划来解决&#xff0c;我们可以使用Kadane’s Algorithm&#xff08;卡登算法&#xff09;来找到具有最大和的连续子数组。 Kadane’s Algorithm 的核心思想是利用一个变量存储当前的累加和 currentSum&#xff0c;并…

MATLAB生物细胞瞬态滞后随机建模定量分析

&#x1f3af;要点 基于随机动态行为受化学主方程控制&#xff0c;定量分析单细胞瞬态效应。确定性常微分方程描述双稳态和滞后现象。通过随机性偏微分方程描述出暂时性滞后会逐渐达到平稳状态&#xff0c;并利用熵方法或截断方法计算平衡收敛速度的估计值。随机定量分析模型使…

python查询并安装项目所依赖的所有包

引言 如果需要进行代码的移植&#xff0c;肯定少不了在另一台pc或者服务器上进行环境的搭建&#xff0c;那么首先是要知道在已有的工程的代码中用到了哪些包&#xff0c;此时&#xff0c;如果是用人工去一个一个的代码文件中去查看调用了哪些包&#xff0c;这个工作甚是繁琐。…

Flutter 鸿蒙next中的路由使用详解【基础使用】

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

C++《vector的模拟实现》

在之前《vector》章节当中我们学习了STL当中的vector基本的使用方法&#xff0c;了解了vector当中各个函数该如何使用&#xff0c;在学习当中我们发现了vector许多函数的使用是和我们之前学习过的string类的&#xff0c;但同时也发现vector当中一些函数以及接口是和string不同的…