Flutter使用ObjectBox排序时重音字符排序异常求助
解决ObjectBox中带重音字符的排序问题
你遇到的问题是因为ObjectBox默认按Unicode代码点排序,带重音的Á(U+00C1)码点远高于普通ASCII字母,所以会排在列表末尾。以下是两种可行的解决方案:
方案一:数据库层面排序(推荐,性能更好)
通过新增一个归一化字段,存储去掉重音的字符串,基于该字段排序:
- 添加依赖处理字符串归一化
在pubspec.yaml中添加unorm_dart包:
dependencies: unorm_dart: ^0.2.0
- 修改实体类,新增归一化字段
更新Kategoriak实体,自动生成无重音的字符串字段:
import 'package:unorm_dart/unorm_dart.dart' as unorm; @Entity() class Kategoriak { int id; String cikkcsoportnev; String cikkcsoportnevNormalized; Kategoriak({ this.id = 0, required this.cikkcsoportnev, String? cikkcsoportnevNormalized, }) : cikkcsoportnevNormalized = cikkcsoportnevNormalized ?? _normalizeText(cikkcsoportnev); // 去除重音并转小写,确保排序一致性 static String _normalizeText(String input) { return unorm.nfd(input) .replaceAll(RegExp(r'[\u0300-\u036f]'), '') .toLowerCase(); } }
- 重新生成ObjectBox代码
运行命令更新实体的数据库适配代码:
flutter pub run build_runner build
- 使用归一化字段排序
修改原排序代码,改用归一化字段:
box.query(myquery)..order(Kategoriak_.cikkcsoportnevNormalized).build()
方案二:内存中排序(适合小数据量)
如果不想修改实体结构,可以查询后在内存中用Dart的本地化排序:
final queryResults = box.query(myquery).build().find(); // 按匈牙利语本地化规则排序(根据你的语言调整locale参数) queryResults.sort((a, b) => a.cikkcsoportnev.compareTo(b.cikkcsoportnev, locale: 'hu'));
注意:该方法需要Dart 2.17+版本支持,且数据量大时性能不如数据库层面排序。
内容的提问来源于stack exchange,提问作者Ebadta
相关产品推荐
相关产品推荐

