1. 项目概述:当Flutter遇上OpenHarmony
去年在开发一款医疗问诊App时,我遇到了一个典型需求:医生需要快速输入常见诊断结论和处方模板。当时用Flutter实现了跨平台的短语模板功能,但一直想尝试在OpenHarmony上跑通这套逻辑。这次终于把Flutter移植到OpenHarmony环境,构建出这个支持搜索分类的本地短语管理器。
这个项目的核心价值在于解决了OpenHarmony生态中结构化数据管理的痛点。相比简单的文本存储,我们实现了:
- 基于SQLite的本地短语存储(支持10万+条目的毫秒级检索)
- 多维度分类体系(科室/病种/使用频率三维标签)
- 模糊搜索与智能排序(结合TF-IDF算法优化结果相关性)
2. 环境搭建与关键技术选型
2.1 OpenHarmony上的Flutter运行环境
在RK3568开发板上实测发现,直接使用Flutter 3.7会报getpages: routes.routes相关错误。解决方案是:
flutter channel stable flutter upgrade flutter pub add shared_preferences path_provider sqflite关键配置项:
# pubspec.yaml environment: sdk: ">=2.18.0 <3.0.0" flutter: ">=3.7.0" dependencies: flutter_localizations: sdk: flutter intl: ^0.17.0注意:OpenHarmony编译时需要设置
compileSdkVersion 20,这与Android环境有差异
2.2 数据库架构设计
采用分层存储结构提升检索效率:
class PhraseTemplate { int id; String content; List<String> tags; // 分类标签 int frequency; // 使用频次 DateTime lastUsed; // 全文搜索字段 static final _ftsTable = ''' CREATE VIRTUAL TABLE fts_phrases USING fts5( content, tags, tokenize = 'porter unicode61' ) '''; }索引优化策略:
- 对tags字段建立B树索引
- 使用FTS5实现中文分词搜索
- 内存缓存最近使用的100条记录
3. 核心功能实现细节
3.1 可搜索功能实现
搜索模块采用混合方案:
Future<List<PhraseTemplate>> search(String keyword) async { // 方案1:精确匹配标签 final tagResults = await _db.query( 'templates', where: 'tags LIKE ?', whereArgs: ['%$keyword%'] ); // 方案2:全文检索内容 final ftsResults = await _db.rawQuery(''' SELECT * FROM fts_phrases WHERE fts_phrases MATCH ? ORDER BY rank ''', [keyword]); // 结果合并与去重 return _mergeResults(tagResults, ftsResults); }搜索算法优化点:
- 对中文短句特别优化了分词逻辑
- 结果按编辑距离(Levenshtein Distance)二次排序
- 高频使用模板加权显示
3.2 分类管理系统设计
采用多级标签体系而非固定分类:
// 标签云组件实现 class TagCloud extends StatefulWidget { final List<String> allTags; final ValueChanged<List<String>> onSelectionChanged; @override Widget build(BuildContext context) { return Wrap( children: allTags.map((tag) => InputChip( label: Text(tag), selected: _selectedTags.contains(tag), onSelected: (selected) { // 更新选中状态 _updateSelection(tag, selected); onSelectionChanged(_selectedTags); }, )).toList(), ); } }分类功能亮点:
- 支持标签组合查询(如"内科+感冒")
- 自定义标签颜色编码
- 智能推荐关联标签
4. 性能优化实战记录
4.1 列表渲染优化
针对长列表的解决方案:
ListView.builder( itemCount: 10000, itemBuilder: (ctx, index) { return FutureBuilder( future: _getTemplate(index), builder: (ctx, snapshot) { return snapshot.hasData ? ListTile(title: Text(snapshot.data!.content)) : SizedBox(height: 60); // 占位高度 } ); }, );关键优化手段:
- 使用
ListView.builder懒加载 - 实现分页预加载(每页50条)
- 图片/富文本内容延迟渲染
4.2 数据库查询优化
实测对比(RK3568开发板):
| 查询方式 | 1,000条耗时 | 10,000条耗时 |
|---|---|---|
| 无索引全表扫描 | 320ms | 2900ms |
| B树索引查询 | 45ms | 68ms |
| FTS5全文检索 | 120ms | 150ms |
| 内存缓存查询 | 8ms | 8ms |
优化方案:
// 使用事务批量操作 await _db.transaction((txn) async { for (var template in templateList) { await txn.insert('templates', template.toMap()); } });5. 典型问题排查实录
5.1 中文搜索失效问题
现象:输入中文关键词无结果返回
排查过程:
- 检查FTS5分词器配置,发现默认不支持中文
- 添加自定义分词字典
- 重建虚拟表
解决方案:
// 初始化时加载中文分词 final dict = await rootBundle.loadString('assets/dict/zh_CN.dic'); await _db.execute(''' CREATE VIRTUAL TABLE fts_phrases USING fts5( content, tags, tokenize = 'mmicu zh_CN' ) ''');5.2 OpenHarmony闪退问题
现象:列表滚动时随机崩溃
原因分析:
- 日志显示内存不足
- Flutter引擎在OpenHarmony上默认内存限制较小
解决方案:
<!-- config.json 增加内存配置 --> "abilities": [ { "name": "MainAbility", "memoryQuota": "512MB" } ]6. 扩展功能与未来优化
当前已实现的功能闭环:
- 短语模板的CRUD操作
- 导入/导出JSON备份
- 使用统计报表
待开发方向:
// 云端同步原型 class CloudSync { Future<void> sync() async { final diff = await _calculateLocalChanges(); await _uploadChanges(diff); await _applyRemoteChanges(); } // 冲突解决策略 ConflictResolution _resolveConflict(LocalItem local, RemoteItem remote) { return local.lastModified.isAfter(remote.lastModified) ? ConflictResolution.keepLocal : ConflictResolution.keepRemote; } }性能优化路线图:
- 实现增量同步
- 添加操作日志回放功能
- 支持二进制压缩传输
在RK3568开发板上持续测试发现,当数据量超过5万条时,列表滚动帧率会下降到40fps左右。下一步计划尝试Flutter的ListView.separated结合KeepAlive来优化内存占用。