GetStorage无法存储Locale,调用saveLocale方法时应用冻结
问题原因
GetStorage无法直接存储Locale对象,因为它属于自定义类,不支持自动序列化/反序列化。直接写入会导致底层序列化逻辑阻塞,引发应用冻结;且异常可能发生在底层序列化流程中,try-catch无法有效捕获,导致控制台无日志输出。
解决方案
核心思路是将Locale对象拆解为可序列化的基础类型(字符串)存储,读取时再重建Locale对象。
1. 修改HandleLocale类,适配序列化存储
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; class HandleLocale { final _storage = GetStorage(); final key = 'locale'; void saveLocale(Locale locale) { try { // 存储语言代码和国家代码的Map,而非直接存Locale对象 _storage.write(key, { 'languageCode': locale.languageCode, 'countryCode': locale.countryCode, }); } catch (e) { print('保存Locale失败: $e'); } } bool isSavedLocale() { return _storage.read(key) != null; } Locale getLocale() { if (isSavedLocale()) { final localeData = _storage.read(key); // 从存储的Map中重建Locale对象 return Locale( localeData['languageCode'], localeData['countryCode'], ); } else { return const Locale('en', 'US'); } } void changeLocale(Locale locale) { try { print(locale); saveLocale(locale); Get.updateLocale(locale); } catch (e) { print('切换Locale出错: $e'); } } }
2. 优化实例调用(可选,更规范)
每次点击ListTile时创建新的HandleLocale实例虽能工作,但建议用单例模式避免重复初始化:
// 在HandleLocale类中添加单例实现 class HandleLocale { static final HandleLocale _instance = HandleLocale._internal(); factory HandleLocale() => _instance; HandleLocale._internal(); // ... 原有代码不变 } // UI中调用保持不变 HandleLocale().changeLocale(locale[index]['locale']);
3. 确保GetStorage初始化完成
在main函数中必须先完成GetStorage初始化:
void main() async { await GetStorage.init(); runApp(const MyApp()); }
关键说明
- GetStorage仅支持存储基础数据类型(String、int、double、bool、Map、List),自定义对象必须拆解为这些类型存储。
- 移除
saveLocale中的rethrow,避免异常向上抛出后无法被上层catch捕获,改为直接打印日志便于调试。 - 修正
getLocale方法,不再固定返回尼泊尔语,而是根据存储的实际值重建Locale,实现真正的持久化切换。
内容的提问来源于stack exchange,提问作者Jeevan Shrestha
相关产品推荐
相关产品推荐

