You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:13:30