首页 > 解决方案 > 如何使用 GetX 存储保存和写入数据?

问题描述

首先我创建了 GetxController 类

  final languageController = GetStorage();

  var myLocal = [];

  void saveLocale(List list) {
    languageController.write('savedLocale', list);
  }

  @override
  void onInit() {
    List<dynamic>? savedLocale = languageController.read('savedLocale');
    if (savedLocale != null) {
      myLocal = savedLocale;
    }
    super.onInit();
  }
}

然后我在 main.dart 中初始化了 GetStorage

final myLocal = LanguageController().myLocal;

void main() async {
  print(myLocal);
  await GetStorage.init();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      translations: LocaleString(),
      locale: myLocal.isNotEmpty
          ? Locale(myLocal[0], myLocal[1])
          : Locale('en', 'US'),
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

然后在设置语言环境后的对话框中我将其写入存储

Future<dynamic> myMaterialDialog(BuildContext context) {
  final LanguageController languageController = Get.find();

  return showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text(chooseLanguage.tr),
          content: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              TextButton(
                onPressed: () {
                  Get.back();
                  Get.updateLocale(Locale('en', 'US'));
                  languageController.saveLocale(['en', 'US']);
                },
                child: Text(englishLanguage.tr),
              ),
              TextButton(
                onPressed: () {
                  Get.back();
                  Get.updateLocale(Locale('ru', 'RU'));
                  languageController.saveLocale(['ru', 'RU']);
                },
                child: Text(russianLanguage.tr),
              ),
            ],
          ),
        );
      });
}

而且它不起作用,每次我重新启动我的应用程序时它都会显示1 myLocale 是空的

为了检查 saveLocale() 方法是否有效,我创建了 printSavedLocale() 方法

 void printSavedLocale() {
    print(languageController.read('savedLocale'));
  }

并在 saveLocale() 之后将其放到对话框按钮上,它正在打印我保存的语言环境,但在重新启动后保存的语言环境为空

标签: flutterdartflutter-getx

解决方案


如果你仍然需要这个,我会以不同的方式使用我的应用程序,但我只是让它在我的主文件中工作(减去你不需要的)

    void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await GetStorage.init();
  await firebaseInitialization.then((value) {
    Get.put(HomeController());
  });

  runApp(Start());
}

class Start extends StatelessWidget {
  Start({
    Key? key,
  }) : super(key: key);
  final storage = GetStorage();

  @override
  Widget build(BuildContext context) {
    Get.put(HomeController());
    print(storage.read('langCode'));
    print(storage.read('countryCode'));

    return GetMaterialApp(
        translations: LocaleString(),
        fallbackLocale: const Locale('en', 'US'),
        locale: storage.read('langCode') != null
            ? Locale(storage.read('langCode'), storage.read('countryCode'))
            : const Locale('ar', 'MA'),
        title: 'title'.tr,
        
        }));
  }
}

我的抽屉上有一个按钮,可以在阿拉伯语和英语之间切换,你可以把它放在任何你想要的地方,你只需要有这个小部件

class Page extends GetView<HomeController>

它为您提供值“控制器”来表示负责该语言的控制器。这是负责开关的按钮:

SizedBox(
                      height: 70,
                      child: OutlinedButton(
                        child: ListTile(
                          title: Text(
                            'language'.tr,
                            style: Theme.of(context).textTheme.headline6,
                            textDirection: TextDirection.rtl,
                          ),
                          leading: const Icon(Icons.language),
                        ),
                        onPressed: () {
                          controller.switchLang();
                        },
                      )),

这是我的 homeController 负责语言环境:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';

class HomeController extends GetxController {
  static HomeController instance = Get.find();
  final storage = GetStorage();
  var ar = const Locale('ar', 'MA');
  var us = const Locale('en', 'US');


  switchLang() {
    
     if (Get.locale == us) {
       Get.updateLocale(ar);
       storage.write('langCode', 'ar');
       storage.write('countryCode', 'MA');
     } else {
       Get.updateLocale(us);
       storage.write('langCode', 'en');
       storage.write('countryCode', 'US');
     }
    update();
   
  }

  
}

在您的情况下,如果您有多个语言环境,只需更改我的 switchlang 函数以处理多个语言环境,您可以使用 switch 案例轻松地做到这一点


推荐阅读