Flutter for OpenHarmony:built_collection 高性能不可变集合(Builder 模式实现极致内存优化) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:built_collection 高性能不可变集合(Builder 模式实现极致内存优化) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

前言

在 Flutter 开发中,State Management (状态管理) 的核心原则通常是 Immutability (不可变性)。
如果我们直接修改 ListMap 的内容,FrameWork 可能检测不到变化,导致 UI 不刷新。或者,因为引用传递(Reference Passing)导致多个组件共享同一个 Mutable List,产生难以追踪的副作用 Bug。

Dart 标准库的 List.unmodifiable 虽然能创建不可变列表,但每次修改都需要全量拷贝(toList()),性能开销大(O(N))。

built_collection 是 Google 维护的一个高性能不可变集合库(它是 built_value生态的一部分)。它采用了 Builder 模式,允许你以看似 Mutable 的方式构建集合,最后生成高效的 Immutable 实例。

对于 OpenHarmony 应用,特别是在处理大量数据列表(如长列表、复杂图表数据)时,使用 built_collection 能显著降低 GC 压力,提升渲染帧率。

一、核心原理

built_collection 包含 BuiltList, BuiltSet, BuiltMap 等类型。
它们的核心思想是:写时拷贝 (Check-on-write)构建器模式

  1. Immutable: BuiltList 实例一旦创建,内容绝不可变。
  2. Builder: 通过 .toBuilder() 获取一个可变的 ListBuilder,由于它基于底层实现优化,在未调用 .build() 前不会频繁触发全量复制。
  3. Efficient: 内部使用了 Trie (前缀树) 或 Hash Array Mapped Trie (HAMT) 等结构(虽然 Dart 版主要是优化了 Copy-on-write),比简单的 List.from 快得多。

toBuilder()

remove(0)

build()

BuiltList

ListBuilder

新 BuiltList

二、集成与用法详解

2.1 添加依赖

dependencies:built_collection: ^5.1.1 

2.2 基础用法

import'package:built_collection/built_collection.dart';voidmain(){// 1. 创建不可变列表final list1 =BuiltList<int>([1,2,3]);// list1.add(4); // 编译错误!没有 add 方法// 2. 修改并生成新列表final list2 = list1.rebuild((b)=> b ..add(4)..addAll([5,6])..remove(1));print(list1);// [1, 2, 3] (原列表未变)print(list2);// [2, 3, 4, 5, 6]}
在这里插入图片描述

2.3 配合 Bloc/Redux

在状态管理中,我们需要生成新的 State。

classAppState{finalBuiltList<String> todos;AppState(this.todos);}// ReducerAppStatereducer(AppState state,dynamic action){if(action isAddTodo){// 极其简洁的更新语法returnAppState(state.todos.rebuild((b)=> b.add(action.text)));}return state;}

三、OpenHarmony 适配与实战:高性能列表渲染

在 OpenHarmony 设备上渲染长列表(ListView)时,Flutter 的 Diff 算法会比较新旧 Widget 的属性。如果属性是 List,因为不仅比较引用的开销O(1),如果引用不同还要比较内容的开销O(N),这可能导致掉帧。

但是,如果你使用 BuiltList

  1. == 比较极快:两个 BuiltList 如果底层数据没变,它们的 hashCode 是缓存的,且 == 操作符经过深度优化(如果引用相同直接返回 true)。
  2. 防止意外修改:你再也不会遇到“我在子组件理清空了 List,结果父组件的数据也没了”这种 Bug。
classTodoListextendsStatelessWidget{// 使用 BuiltList 而不是 ListfinalBuiltList<String> items;constTodoList({Key? key, required this.items}):super(key: key);@overrideWidgetbuild(BuildContext context){returnListView.builder( itemCount: items.length, itemBuilder:(context, index){returnListTile(title:Text(items[index]));},);}}

3.1 序列化 (JSON)

虽然 built_collection 不直接提供 JSON 支持,但它通常配合 built_valuejson_serializable 使用。
需要编写自定义 Converter。

// json_serializable 配置classBuiltListConverterimplementsJsonConverter<BuiltList<dynamic>,List<dynamic>>{constBuiltListConverter();@overrideBuiltList<dynamic>fromJson(List<dynamic> json)=>BuiltList<dynamic>(json);@overrideList<dynamic>toJson(BuiltList<dynamic> object)=> object.toList();}

四、功能详解:深度集合 (Nested Collections)

处理嵌套数据结构(如 Map<String, List<int>>)通常很痛苦。

// 标准 Dart: 修改深层数据需要多层拷贝var newMap =Map<String,List<int>>.from(oldMap); newMap['key']=List<int>.from(newMap['key']!)..add(1);

使用 built_collection

final map =BuiltMap<String,BuiltList<int>>({'nums':BuiltList([1,2])});final newMap = map.rebuild((b)=> b ..['nums']=(b['nums']!.toBuilder()..add(3)).build());// 虽然看起来稍微繁琐,但它是线程安全且高效的
在这里插入图片描述

五、总结

built_collection 是追求极致性能和代码安全性的开发者的首选。它强迫你使用 Builder 模式来修改数据,虽然多写了几行代码,但换来的是零副作用极高的运行时效率

对于 OpenHarmony 开发者:

  • 内存优化:在内存受限的 IoT 设备上,避免不必要的 List 拷贝能节省大量 RAM。
  • 架构清晰:它是 Redux/Bloc 架构的最佳拍档,让状态流转清晰可见。

最佳实践

  1. API 边界:在 Service/Repository 层的返回值中使用 BuiltList,明确告诉调用者:这个数据是只读的,不要尝试修改它。
  2. 避免滥用:在局部的小逻辑(如一个临时 for 循环处理)中,普通的 List 足够了。只在跨组件传递状态时使用 BuiltList

六、完整实战示例

import'package:built_collection/built_collection.dart';voidmain(){print('=== 基础 List 操作 ===');// 1. 创建不可变列表final list =BuiltList<int>([1,2,3]);// 2. 修改:必须通过 rebuild,它返回新对象final newList = list.rebuild((b)=> b ..add(4)..remove(1));print('原始列表: $list');// [1, 2, 3]print('新列表: $newList');// [2, 3, 4]print('\n=== 深度嵌套修改 ===');// 3. 嵌套结构的痛点解决final map =BuiltMap<String,BuiltList<int>>({'奇数':BuiltList([1,3]),'偶数':BuiltList([2,4]),});// 需求:给 '奇数' 列表里添加一个 5final updatedMap = map.rebuild((b)=> b ..updateValue('奇数',(listBuilder)=> listBuilder..add(5)));print('原始 Map: $map');// {奇数: [1, 3], 偶数: [2, 4]}print('更新后 Map: $updatedMap');// {奇数: [1, 3, 5], 偶数: [2, 4]}}
在这里插入图片描述

Read more

LazyLLM 多 Agent 应用全流程实践:从源码部署到可视化 Web 调试的低代码方案

LazyLLM 多 Agent 应用全流程实践:从源码部署到可视化 Web 调试的低代码方案

LazyLLM 多 Agent 应用全流程实践:从源码部署到可视化 Web 调试的低代码方案 前言:为什么选择 LazyLLM 构建多 Agent 大模型应用? LazyLLM 作为低代码构建多 Agent 大模型应用的开发工具,可大幅降低大模型应用的开发与部署门槛。本文聚焦其在豆包模型的落地实践,将从源码部署豆包文本模型的完整配置步骤入手,延伸至官方 WebModule 启动可视化 Web 界面的实操流程,并配套精准性、简洁度等多维度的部署测试说明,为开发者提供可直接对照的实操指南,助力高效完成豆包模型在 LazyLLM 框架下的部署与验证。 LazyLLM 整体架构解析:三层联动的多 Agent 运行体系 LazyLLM 的架构分为三层级递进结构,各层级分工明确且联动协同,实现从应用开发到落地执行的全流程覆盖:上层(LazyPlatform AI 大模型应用开发平台):核心含应用编排平台以可视化编排、发布、回流、调优的闭环完成应用构建迭代与平台管理模块通过租户、权限管理支撑多用户运维,是开发者的高效开发管理入口中层(

By Ne0inhk

黑马程序员java web学习笔记--后端进阶(二)SpringBoot原理

目录 1 配置优先级 2 Bean的管理 2.1 Bean的作用域 2.2 第三方Bean 3 SpringBoot原理 3.1 起步依赖 3.2 自动配置 3.2.1 实现方案 3.2.2 原理分析 3.2.3 自定义starter 1 配置优先级 SpringBoot项目当中支持的三类配置文件: * application.properties * application.yml ❤ * application.yaml 配置文件优先级排名(从高到低):properties配置文件 > yml配置文件 > yaml配置文件 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置。

By Ne0inhk

别再手动切图!用 ClaudeCode+Figma-MCP 实现 UI 设计 1:1 前端还原

使用 Figma-MCP 实现设计还原 Figma-MCP(Measure Copy Paste)是 Figma 的插件,能够快速提取设计稿中的间距、颜色、尺寸等参数,避免手动测量。安装后选中元素即可查看属性,按 Alt 键复制数值,直接粘贴到代码中。 配置 ClaudeCode 生成代码 ClaudeCode 是 Claude 的代码生成功能,支持根据设计参数输出前端代码。在对话中描述需求并附上 Figma-MCP 提取的数据,例如: 生成一个 React 按钮组件,参数如下: - 宽度:120px - 高度:40px - 背景色:#3B82F6 - 圆角:8px - 文字:"

By Ne0inhk
200+有趣的HTML前端游戏项目合集(5月17日更新,持续更新中)

200+有趣的HTML前端游戏项目合集(5月17日更新,持续更新中)

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海导航】💅 想寻找共同学习交流,摸鱼划水的小伙伴,请点击【全栈技术交流群】 两百个简单的 HTML 游戏项目,可提高你的前端技能。 海拥摸鱼小游戏 在线地址(持续更新中):https://game.haiyong.site 源码可联系站长获取 ⭐️ 星标为热门小游戏 游戏项目汇总 ✨ 编号游戏说明1⭐️杀死国王:https://haiyong.site/moyu/kill-the-king.html疯狂点击空格键就行2挡板小游戏:https://haiyong.site/moyu/danban.html随心所欲的放挡板,挡住下面掉下来的球球3吃豆人游戏:https://haiyong.site/moyu/dou.html吃豆人在走路的时候不会停下,只能转方向。通过你的智慧去闯关吧🎉4飞越天空之城:https://haiyong.site/moyu/

By Ne0inhk