flutter - 如何使用 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() 之后将其放到对话框按钮上,它正在打印我保存的语言环境,但在重新启动后保存的语言环境为空
解决方案
如果你仍然需要这个,我会以不同的方式使用我的应用程序,但我只是让它在我的主文件中工作(减去你不需要的)
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 案例轻松地做到这一点
推荐阅读
- r - 使用 fct_relevel 按组重新排序因子仅更改第一组中的因子顺序
- cakephp - 在 CakePHP 3x 中根据城市显示数据
- sql - 列的不同数据源
- html - 不能让这些 div 内联显示?
- python - 在 Django 中训练 AI 模型,如何以 JSON 格式返回结果?
- python - django、node js、php网站托管和域信息
- java - 如何平均 ArrayList 中的内容?
- python - 如何使用正则表达式查询 pymongo 以获取仅包含数字的值
- python - Django URLField ErrorDetail“请输入有效的URL”
- python - 不能腌制生成器对象