Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中
Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中
在 Flutter 中,build
方法被设计在 StatefulWidget
的 State
类中而非 StatefulWidget
类本身,这种设计基于几个重要的架构原则和实际考量:
1. 核心设计原因
1.1 生命周期管理
- State 对象是长寿命的:当 Widget 重建时(如因父 Widget 重建),
StatefulWidget
会被重新创建,但State
对象会被 Flutter 框架保留 - build 方法需要稳定环境:将
build
放在State
中可以确保即使 Widget 实例被重建,build
方法仍能访问之前的状态
1.2 状态与表现分离
- 关注点分离原则:
StatefulWidget
:负责声明配置信息(通常是不可变的)State
:负责管理可变状态和构建 UI
- 逻辑一致性:所有可变内容(包括构建方法)都集中在
State
中管理
2. 架构优势
2.1 性能优化
- 高效重建:当父 Widget 重建时,
StatefulWidget
实例会被替换,但State
保持不变,避免不必要的状态丢失和重建开销 - 局部更新:
State
可以决定是否需要调用build
方法,实现精确的重建控制
2.2 状态保持
class CounterWidget extends StatefulWidget { _CounterWidgetState createState() => _CounterWidgetState();
}class _CounterWidgetState extends State<CounterWidget> {int count = 0; // 状态得以保持Widget build(BuildContext context) {return Text('$count');}
}
即使 CounterWidget
被重建多次,_CounterWidgetState
保持同一实例,count
值不会丢失
2.3 热重载友好
- 状态不受热重载影响:热重载会重建 Widget 树但保留
State
,确保应用状态不丢失 - 开发体验更流畅:开发者可以快速迭代 UI 而不丢失当前应用状态
3. 与 StatelessWidget 的对比
特性 | StatelessWidget | StatefulWidget |
---|---|---|
build 方法位置 | Widget 类中 | State 类中 |
状态管理 | 无状态 | 通过 State 管理 |
重建行为 | 完全重建 | Widget 重建但 State 保留 |
生命周期 | 简单 | 完整生命周期方法 |
4. 底层实现原理
Flutter 框架通过以下机制实现这种设计:
-
Element 树维护:
- 每个
StatefulWidget
对应一个StatefulElement
StatefulElement
持有State
实例的引用
- 每个
-
重建流程:
// 伪代码示意 void update(StatefulWidget newWidget) {super.update(newWidget);// Widget 实例被替换// 但 State 对象保持不变 }
-
构建调度:
- 当
setState()
调用时,框架标记该Element
为 “dirty” - 下一帧只会重建标记为 “dirty” 的组件
- 当
5. 实际开发意义
5.1 状态安全
void increment() {setState(() {count++; // 状态变更被安全地封装在 State 中});
}
5.2 高效重建
ParentWidget → 重建↓
ChildWidget(Stateful) → 仅 Widget 配置更新↓
ChildState → 保持原实例,选择性重建 UI
5.3 灵活的初始化
void initState() {super.initState();// 可以安全地执行初始化操作_loadData();
}
6. 为什么不是其他设计?
替代方案及其问题:
-
将 build 放在 Widget 中:
- 每次重建都会丢失状态
- 无法实现有状态的 UI
-
完全分离模式:
- 会增加架构复杂度
- 破坏 Flutter 的响应式编程模型
-
全局状态管理:
- 对于局部状态过于重量级
- 不符合 Flutter 的组件化设计理念
这种设计是 Flutter 团队经过深思熟虑后的最佳折衷方案,它:
- 保持了 React 式响应编程的简洁性
- 提供了高效的状态管理机制
- 确保了优秀的开发体验和运行时性能
理解这一设计原理有助于开发者更好地编写高效、可维护的 Flutter 应用。
Flutter 页面路由切换后 StatefulWidget 的状态重建问题
在 Flutter 中,当页面路由切换后又返回时,StatefulWidget
及其 State
是否会被重建取决于具体情况和路由管理方式。以下是详细分析:
1. 使用 Navigator.push/pop 的标准情况
不会重建的情况(默认行为)
- 当使用默认的 MaterialPageRoute 或 CupertinoPageRoute:
- 原页面的
StatefulWidget
和State
对象会被保留 - 不会触发
dispose()
,只是暂时从视图树中移除 - 返回时恢复原有状态
- 原页面的
Navigator.push(context,MaterialPageRoute(builder: (context) => SecondPage()),
);
会重建的情况
- 如果新页面使用
pushReplacement
替换当前路由:- 当前路由的
StatefulWidget
和State
会被销毁 - 触发
dispose()
方法
- 当前路由的
Navigator.pushReplacement(context,MaterialPageRoute(builder: (context) => SecondPage()),
);
2. 影响重建行为的因素
2.1 路由类型
路由类型 | 返回时是否重建 | 说明 |
---|---|---|
MaterialPageRoute | 否 | 默认缓存页面状态 |
CupertinoPageRoute | 否 | iOS风格路由,同样缓存 |
PageRouteBuilder | 取决于实现 | 需手动维护状态 |
自定义 Route | 取决于实现 | 需自行管理生命周期 |
2.2 系统内存压力
- 在低内存情况下,Flutter 可能自动清理缓存的页面状态
- 这种情况较少见,但需要做好状态恢复的准备
3. 状态保留机制
Flutter 通过以下机制保留状态:
- 路由栈维护:Navigator 维护路由栈,保留非活动路由的引用
- Element 树保留:关联的 Element 和 State 对象被保留在内存中
- Widget 重建不影响 State:即使 Widget 被重建,State 仍保持
4. 验证示例
class HomePage extends StatefulWidget { _HomePageState createState() => _HomePageState();
}class _HomePageState extends State<HomePage> {int _counter = 0;void initState() {super.initState();print('HomePage initState');}void dispose() {print('HomePage dispose');super.dispose();}Widget build(BuildContext context) {print('HomePage build');return Scaffold(body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('Counter: $_counter'),ElevatedButton(onPressed: () => setState(() => _counter++),child: Text('Increment'),),ElevatedButton(onPressed: () => Navigator.push(context,MaterialPageRoute(builder: (_) => SecondPage()),),child: Text('Go to Second'),),],),),);}
}
观察结果:
- 首次进入:
initState()
→build()
- 跳转第二页:无生命周期方法调用
- 返回首页:直接显示之前状态,无
initState()
调用 - 计数器保持之前数值
5. 特殊情况处理
5.1 需要强制刷新的情况
如果希望返回时刷新页面,可以使用:
// 在返回时接收数据并刷新
Navigator.push(context,MaterialPageRoute(builder: (context) => SecondPage()),
).then((value) {// 返回时执行setState(() {}); // 手动触发刷新
});
5.2 使用 GlobalKey 保持状态
即使路由被替换,也可以通过 GlobalKey 保持特定 Widget 的状态:
final globalKey = GlobalKey();Navigator.pushReplacement(context,MaterialPageRoute(builder: (context) => MyPage(key: globalKey)),
);
6. 最佳实践
- 不要依赖绝对不重建:虽然默认不重建,但极端情况下可能被清理
- 重要状态持久化:对于关键数据,建议使用:
SharedPreferences
- 状态管理方案(Provider/Riverpod等)
- 本地数据库
- 实现恢复逻辑:覆盖
restoreState
方法处理可能的状态恢复 - 谨慎使用 dispose:在
dispose()
中清理资源,但不要依赖它作为保存状态的时机
总结
在标准使用 MaterialPageRoute
或 CupertinoPageRoute
的情况下:
- ✅ 不会重建:StatefulWidget 和 State 会被保留
- ✅ 状态保持:所有变量值保持不变
- ❌ 不会调用:initState 和 dispose 不会被再次调用
这种设计提供了流畅的用户体验,避免了不必要的重建开销,同时开发者也需要了解这一机制来正确管理应用状态。
相关文章:
Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中
Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中 在 Flutter 中,build 方法被设计在 StatefulWidget 的 State 类中而非 StatefulWidget 类本身,这种设计基于几个重要的架构原则和实际考量: 1. 核心设计原因 1.1 生命周期管理…...
多技术栈 iOS 项目的性能调试实战:从 Flutter 到 Unity(含 KeyMob 工具实测)
多技术栈 iOS 项目的性能调试实战:从 Flutter 到 Unity 随着移动端开发日趋多元化,iOS 项目中纯 Objective-C/Swift 已不再是唯一选择。越来越多团队采用 Flutter、React Native、Unity、WebView 混合等方案构建 App。这种“技术栈混合”带来灵活性的同…...
Base64加密解密
Base64 是一种基于 64 个可打印字符来表示二进制数据的编码方式,常用于需要通过文本协议传输二进制数据的场景(如 URL、邮件)。以下是不同场景下生成 Base64 编码的方法: 一、编程语言实现 Python import base64# 字符串转Base…...
程序设计基础----排序(2)
1、冒泡排序 #include <stdio.h>#define N 1000 int arr[N];/* 对长度为n的数组arr执行冒泡排序 */ void bubbleSort(int arr[], int n);/* 打印长度为n的数组arr */ void printArray(int arr[], int n);void swap(int *xp, int *yp) {int temp *xp;*xp *yp;*yp temp…...
C++:vector容器
vector容器与array容器相似,但vector容器是动态的,可以自动扩容。 使用方法和一些注意如下: #include<iostream> #include<vector> using namespace std;int main() {vector<char> vec { a,b,c,d };vec[4] e;//不能以此…...
十四、Hive 视图 Lateral View
作者:IvanCodes 日期:2025年5月20日 专栏:Hive教程 在Hive中,我们经常需要以不同于原始表结构的方式查看或处理数据。为了简化复杂查询、提供数据抽象,以及处理复杂数据类型(如数组或Map)&#…...
Frp Dockr Mysql内网映射
用 FRP 远程暴露 Mac mini 上的 Docker-MySQL(含 Ubuntu frps 安装和 macOS 客户端配置) 一、环境说明 服务器(公网):Ubuntu 22.04 frps内网设备:macOS (Mac mini) frpc Docker MySQL目标:…...
PHP 扇形的面积(Area of a Circular Sector)
圆形扇区或圆形扇区是圆盘上由两个半径和一个圆弧围成的部分,其中较小的区域称为小扇区,较大的区域称为大扇区。让我们看看这个图,试着找出扇区: 在该图中,绿色阴影部分是扇形,“r”是半径,“th…...
物业后勤小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的物业后勤小程序源码,它为物业管理提供了高效便捷的解决方案。 该源码功能丰富,涵盖房屋认证、家人认证,保障社区居住安全;支持报事报修、装修申请,方便业主与物业沟通;还…...
git基础操作
当远程仓库迁移到一个新的组下面时,你需要在本地仓库中更新远程仓库的URL,以便与新的远程仓库关联。以下是详细步骤: 获取新的远程仓库URL: 首先,你需要从GitLab或相关平台获取新组下的仓库的新URL。通常,仓…...
鸿蒙HarmonyOS 【ArkTS组件】通用属性-背景设置
📑往期推文全新看点(附带最新鸿蒙全栈学习笔记) 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选? 分享一场鸿蒙开发面试经验记录(三面…...
java 在用redis 的时候,如何合理的处理分页问题? redis应当如何存储性能最佳
在 Java 中使用 Redis 处理用户表分页时,需结合其数据结构特性优化存储和查询 1. 数据结构设计 场景需求 用户表字段:id, name, age, register_time(注册时间)分页要求:按注册时间倒序分页展示,每页 10 条…...
分类预测 | Matlab实现PNN概率神经网络多特征分类预测
分类预测 | Matlab实现PNN概率神经网络多特征分类预测 目录 分类预测 | Matlab实现PNN概率神经网络多特征分类预测分类效果代码功能算法流程程序设计参考资料分类效果 代码功能 该代码实现了一个基于**概率神经网络(PNN)**的多分类任务,核心功能如下: 数据预处理 读取Exce…...
spring-retry
学习链接 【SpringBoot】spring-retry(重试机制) 【Spring】Spring Retry CSDN有点可恶啊,拿着别人的文章,要开VIP才能看...
RTMP协议解析【二】
文章目录 RTMP协议解析【二】RTMP消息消息的格式Basic HeaderMessage HeaderExtended Timestamp RTMP协议解析【二】 本专栏重点负责介绍RTMP协议的理论部分, 跳过定义,协议与其他协议的优缺点对比,协议的拓展与改进,协议的历史发…...
WebGL2混合与雾
混合技术 一、混合基本技术 混合技术就是将两个片元调和,主要通过各种测试将准备进入帧缓冲(源片元)与帧缓冲中原有片元(目标片元)按照设定的比例加权计算出最终片元的颜色值 。 两种常用 组合 : 源因子…...
Windows Docker笔记-扩展
docker扩展知识点 开放容器端口 背景,有一个docker Centos7镜像,运行容器后,想要通过22端口远程这个容器 创建容器时开放映射端口,将容器的22端口映射到本地的22端口 docker run -p <宿主机端口>:<容器端口> 镜像名…...
【C++ Primer 学习札记】智能指针
1)std::unique_ptr(独占所有权) 特点: 独占资源的所有权,同一时间只能有一个 unique_ptr 指向特定对象。 不可复制,但可以通过 std::move 转移所有权。 轻量级,几乎无额外开销(与…...
【嵌入式人工智能产品开发实战】(二十二)—— 政安晨:改造小智AI开发智能体硬件(案例:移植PowerManager后麦克风不工作)
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 确定你硬件的关键点 案例分析 🔍 一、关键代码分析 ✅ 1. power_save_…...
Taro Error: chunk common [mini-css-extract-plugin]
目录 一、问题描述 二、解决方案 一、问题描述 taro项目编译时抛出一下异常: Error: chunk common [mini-css-extract-plugin] Conflicting order. Following module has been added: * css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].oneOf…...
【深度学习】多目标融合算法(六):渐进式分层提取模型PLE(Progressive Layered Extraction)
目录 一、引言 二、PLE(Progressive Layered Extraction,渐进式分层提取模型) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一…...
ping、tcpping、psping、paping、hping的区别
ping、tcpping、psping、paping、hping的区别 这些工具都是用于网络测试的,但它们在功能和协议上有所不同,适用于不同的场景。 ping 基本功能: 发送ICMP echo请求包,并等待接收echo应答包,从而判断网络是否连通&…...
【Redis8】最新安装版与手动运行版
1. 下载 Redis 百度网盘 2. 解压后直接运行 redis-server.exe 3. 使用安装版 双击 install_redis_service.bat 输入安装路径(请提前创建好安装路径)后直接回车下一步直接回车即可,因为是使用配置模板文件为默认解压出来的,然后…...
前端(小程序)学习笔记(CLASS 1):组件
1、小程序中组件的分类 小程序中的组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构。官方把小程序的组件分为了9大类,分别是: * 视图容器,* 基础内容,* 表单组件,* 导航组件 媒体…...
Python MD5加密算法脚本
基本概念 MD5(Message Digest Algorithm 5)是一种常用的哈希函数,用于将任意长度的数据转换为固定长度的哈希值,通常为128位(16字节)。 特点 不可逆性:无法从哈希值还原出原始数据。无论原始…...
Python数据分析实战:Pandas高效处理Excel数据指南
目录 引言:为什么选择Pandas处理Excel? 一、环境搭建与数据读取 1.1 基础环境配置 1.2 数据高效载入技巧 二、数据清洗核心战术 三、数据加工实战案例 3.1 销售数据透视分析 3.2 异常值检测 3.3 跨表关联分析 四、性能优化秘籍 4.1 大文件处理…...
使用Starrocks制作拉链表
5月1日向ods_order_info插入3条数据: CREATE TABLE ods_order_info(dt string,id string COMMENT 订单编号,total_amount decimal(10,2) COMMENT 订单金额 ) PRIMARY KEY(dt, id) PARTITION BY (dt) DISTRIBUTED BY HASH(id) PROPERTIES ( "replication_num&q…...
【npm】npm命令大全
掌握 NPM:前端与 Node.js 开发者必备命令大全 NPM (Node Package Manager) 无疑是现代 JavaScript 开发的基石。无论是前端项目还是 Node.js 后端服务,NPM 都扮演着管理依赖、执行脚本、发布模块等关键角色。熟悉并熟练使用 NPM 命令,能够极…...
最新版Chrome浏览器调用ActiveX控件技术——alWebPlugin中间件V2.0.42版发布
allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…...
32核64G内存的物理机上,Netty理论能承载多少连接?
在 32核64G内存 的机器上,Netty 能承载的连接数取决于 业务场景、配置优化 和 操作系统调优。 以下是详细分析和实测数据参考: 1. 理论估算(基于资源限制) 资源影响内存每个连接占用 10KB~1MB(取决于业务࿰…...
对于final、finally和finalize不一样的理解
目录 1、final 1.1、不可变性(Immutability) 1.2、内存可见性(Visibility) 1.3、初始化安全(Initialization Safety) 1.4、禁止重排序(Reordering) 1、静态常量 2、实例常量 …...
Open CASCADE学习|刚体沿曲线运动实现方法
在三维几何建模中,刚体沿参数化曲线的运动模拟是机械运动仿真、机器人路径规划等领域的核心需求。本文基于Open Cascade几何内核,系统阐述刚体沿曲线运动的实现方法,重点解析标架构建、坐标变换及鲁棒性控制等关键技术。 一、基于标架的刚体运…...
工作流引擎-03-聊一聊什么是流程引擎(Process Engine)?
前言 大家好,我是老马。 最近想设计一款审批系统,于是了解一下关于流程引擎的知识。 下面是一些的流程引擎相关资料。 工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&#x…...
centos7 p8p1使用ip addr查看时有的时候有两个ip,有的时候只有一个ip,有一个ip快,有一个ip慢
在CentOS 7系统中,网络接口 p8p1 出现IP地址数量变化且访问速度不一致的问题,通常与以下原因相关。以下是逐步排查与解决方案: 1. 检查网络配置文件 可能原因:存在多个配置文件或重复配置(如静态IP与DHCP冲突…...
回溯算法——排列篇
目录 一、全排列 二、全排列II 一、全排列 46. 全排列 - 力扣(LeetCode) class Solution {List<List<Integer>> resultnew ArrayList<>();LinkedList<Integer> pathnew LinkedList<>();boolean[] used;public List<…...
Unity中SRP Batcher使用整理
SRP Batcher 是一种绘制调用优化,可显著提高使用 SRP 的应用程序的性能,SRP Batcher 减少了Unity为使用相同着色器变体的材质准备和调度绘制调用所需的CPU 时间。 工作原理: 传统优化方法通过减少绘制调用次数提升性能,而SRP Batcher的核心理念在于降低绘制调用间的渲染状…...
【JAVA学习】泛型
传统方法不能对加入到集合ArrayList中的数据类型进行约束,遍历的时候需要进行类型转换,如果集合中的数据量较大,对效率有影响。泛型又称参数化类型,是JDK5.0出现的新特性,解决数据类型的安全性问题,在类声明…...
实验分享|基于千眼狼sCMOS科学相机的流式细胞仪细胞核成像实验
实验背景 流式细胞仪与微流控技术,为细胞及细胞核成像提供新的路径。传统流式细胞仪在细胞核成像检测方面存在检测通量低,荧光信号微弱等局限,故某光学重点实验室开发一种基于高灵敏度sCMOS科学相机并集成在自组荧光显微镜的微流控细胞核成像…...
MySQL中的JSON_CONTAINS函数用法
MySQL中的JSON_CONTAINS函数用于检查一个JSON文档(目标)是否包含另一个JSON文档(搜索值)。以下是其详细用法: 函数语法 JSON_CONTAINS(target_json, search_json [, path]) target_json:要检查的目…...
如何在 Windows 11 或 10 上将 DNS 更改为 Cloudflare提供的 DNS 服务
域名解析服务(DNS)对于互联网来说至关重要,因为它使我们能够轻松地通过在浏览器中输入域名来访问网站。DNS 的作用是将域名解析为 IP 地址;你可以将其视为互联网上的电话簿。这是因为互联网上的计算机或服务器是通过 IPv4 或 IPv6(数字格式)来识别的,然而,要用户去记住…...
解除diffusers库的prompt长度限制(SDXL版)
2025-5-21 注:本文只提供思路,没有解决“权重识别”、“BREAK”问题。 要想实现与webui一样的绘图效果与无限prompt,可参考diffusers/examples/community/lpw_stable_diffusion_xl.py 1、上代码 from diffusers import StableDiffusionXLP…...
RISC-V 开发板 MUSE Pi Pro CSI测试,一把点亮ov5647摄像头
视频讲解: RISC-V 开发板 MUSE Pi Pro CSI测试,一把点亮ov5647摄像头 手上正好有一颗ov5674,看了下接口排线都是一致的,硬件条件满足的情况下,剩下的就是驱动软件的问题,直接接上CSI排线 https://bianbu-li…...
Word2Vec模型学习和Word2Vec提取相似文本体验
文章目录 说明Word2Vec模型核心思想两种经典模型关键技术和算法流程优点和局限应用场景 Word2Vec提取相似文本完整源码执行结果 说明 本文适用于初学者,体验Pytorch框架在自然语言处理中的使用。简单了解学习Word2Vec模型,体验其使用。 Word2Vec模型 …...
[测试_3] 生命周期 | Bug级别 | 测试流程 | 思考
目录 一、软件测试的生命周期(重点) 1、软件测试 & 软件开发生命周期 (1)需求分析 (2)测试计划 (3)测试设计与开发 (4)测试执行 (5&am…...
epoll_wait未触发的小Bug
上次看了一下epoll监听的原理,在Android Jni里使用epoll,来监听Gpio口的变化事件,具体代码如下: 打开 GPIO 文件描述符,因为该文件是内核虚拟出来的,不是实际文件,所以无法使用FileObserver来监…...
Unity异步加载image的材质后,未正确显示的问题
简述: 此问题涉及到Unity的UI刷新机制 问题描述: 如图所示,想要实现在打开新的界面时候,通过修改材质的方式,修改image的显示内容。 明明已经给image添加上材质了,可还是一片空白? 先看看代…...
Python----循环神经网络(Word2Vec)
一、Word2Vec Word2Vec是word to vector的简称,字面上理解就是把文字向量化,也就是词嵌入 的一种方式。 它的核心就是建立一个简单的神经网络实现词嵌入。 其模型仅仅包括输入层、隐藏层和输出层,模型框架根据输入输出的不同,主要…...
Oracle Enqueue Names
Oracle Enqueue Names Enqueue(排队锁)是Oracle数据库中用于协调多进程并发访问共享资源的锁机制。 This appendix lists Oracle enqueues. Enqueues are shared memory structures (locks) that serialize access to database resources. They can be…...
微服务中API网关作用(统一入口、路由转发、协议转换、认证授权、请求聚合、负载均衡、熔断限流、监控日志)
文章目录 在微服务架构中,API网关主要有以下作用1. 统一入口:作为所有客户端请求的单一入口点,隐藏后端服务的复杂性2. 路由转发:将客户端请求准确路由到适当的微服务(如图中的服务A、B、C)3. 协议转换&…...
Linux `cat` 命令深度解析与高阶应用指南
Linux `cat` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似命令对比二、选项系统详解1. 常用选项矩阵2. 组合使用技巧三、高阶应用场景1. 数据流处理2. 系统维护操作3. 开发调试应用四、安全与权限管理1. 访问控制策略2. 二进制文件处理五、性能优化策略1.…...