如何修复Flutter中使用Hive设置Locale时出现的_AssertionError?
修复Hive读取Locale时触发的_AssertionError断言错误
错误信息
_AssertionError ('dart:ui/platform_dispatcher.dart': Failed assertion: line 1919 pos 15: '
': is not true.)
问题代码
final box = await Hive.openBox('principale'); String _lingua = box.get("locale") ?? "${Localizations.localeOf(context)}"; _locale = Locale(_lingua); // 在此处触发错误 setState(() {});
问题原因
Localizations.localeOf(context).toString()的返回格式是Locale(en, US)这类带括号的字符串,直接传入Locale构造函数会导致解析失败,触发底层断言错误。另外,如果Hive中存储的locale值不符合标准语言代码格式,也会引发该问题。
解决方案
方案1:仅使用语言代码
修改代码,直接提取系统Locale的languageCode而非转成字符串:
final box = await Hive.openBox('principale'); final systemLocale = Localizations.localeOf(context); // 优先读取Hive存储值,否则使用系统语言代码 String _lingua = box.get("locale") ?? systemLocale.languageCode; _locale = Locale(_lingua); setState(() {});
方案2:支持带国家/地区码的Locale
如果需要支持带国家码的多区域Locale(如en_US、zh_CN),需规范存储和读取逻辑:
final box = await Hive.openBox('principale'); final systemLocale = Localizations.localeOf(context); // 存储时采用"语言代码_国家代码"格式,读取时优先用存储值,否则用系统Locale的组合格式 String localeStr = box.get("locale") ?? "${systemLocale.languageCode}_${systemLocale.countryCode ?? ''}"; // 拆分字符串获取语言和国家代码 final parts = localeStr.split('_'); _locale = Locale(parts[0], parts.length > 1 && parts[1].isNotEmpty ? parts[1] : null); setState(() {});
额外注意事项
- 确保Hive中存储的
locale值为标准格式:要么是纯语言代码(如en、zh),要么是语言代码_国家代码(如en_US、zh_CN) - 避免直接将
Locale对象转成字符串后存储,建议存储拆分后的语言/国家代码组合。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

