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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:17:50