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

使用GetX Storage存储多语言配置,重启后数据丢失如何解决?

问题根源

  • 初始化顺序错误:全局声明的myLocal在GetStorage.init()执行前就已经完成赋值,此时存储还未加载,只能拿到初始空值。
  • Controller实例不统一:直接通过LanguageController()创建的实例没有注册到GetX的依赖容器中,和后续Get.find()获取的不是同一个实例,数据无法互通。
  • 读取逻辑时机错误:Controller的onInit执行时,GetStorage可能还未完成初始化,导致读取存储返回null。

修复步骤

  1. 调整LanguageController逻辑,增加主动初始化方法,改为响应式变量方便自动更新:
class LanguageController extends GetxController {
  final GetStorage storage = GetStorage();
  RxList myLocal = [].obs;

  void saveLocale(List list) {
    storage.write('savedLocale', list);
    myLocal.value = list;
  }

  void initLocale() {
    List<dynamic>? savedLocale = storage.read('savedLocale');
    myLocal.value = savedLocale ?? ['en', 'US'];
  }

  @override
  void onInit() {
    initLocale();
    super.onInit();
  }
}
  1. 重写main.dart初始化逻辑,严格按照「初始化引擎→初始化存储→注册Controller→读取存储值→启动应用」的顺序执行:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 先初始化GetStorage
  await GetStorage.init();
  // 注册Controller到GetX容器,全局唯一实例
  final langController = Get.put(LanguageController());
  // 主动读取存储中的多语言配置
  langController.initLocale();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // 获取全局唯一的Controller实例
    final langController = Get.find<LanguageController>();
    // 用Obx包裹实现多语言切换时自动生效
    return Obx(
      () => GetMaterialApp(
        translations: LocaleString(),
        locale: Locale(langController.myLocal[0], langController.myLocal[1]),
        debugShowCheckedModeBanner: false,
        home: const HomeScreen(),
      ),
    );
  }
}
  1. 弹窗逻辑不需要修改,只要保证Get.find()能拿到已注册的Controller实例即可,保存后的数值会自动同步到全局,重启应用也会从存储中加载对应配置。

补充说明

之前存完能打印、重启就读空的原因是:运行时调用save后读取的是GetStorage在内存中的缓存值,所以能正常返回,但是重启后你先初始化了空数组,再初始化存储,自然拿不到之前存的内容。

内容的提问来源于stack exchange,提问作者brennschluss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:45:05