场景
持久化存储国际化方案,优先使用用户设置的语言>设备使用的语言>中文
使用GetxController做状态处理工具
使用步骤
1.引入库
依赖库版本:
get: ^4.6.6
get_storage: ^2.1.1
2.LocaleController类
代码如下:
class LocaleController extends GetxController {
late Rx<Locale?> locale;
late GetStorage _box;
void onInit() {
_box = GetStorage();
final languageTag = _box.read('locale');
if (languageTag != null) {
locale = createLocale(languageTag).obs;
} else {
locale = Get.deviceLocale.obs;
}
super.onInit();
}
Locale createLocale(String languageTag) {
// languageTag形式为zh_CN、en_US等
final List<String> parts = languageTag.split('_');
if (parts.length > 1) {
return Locale(parts[0], parts[1]);
} else {
return Locale(parts[0]);
}
}
void setLocale(String languageTag) {
Locale newLocale = createLocale(languageTag);
locale(newLocale);
_box.write('locale', languageTag);
Get.updateLocale(newLocale);
Get.offAllNamed('/');
}
}
因为没有用languageTag的构造函数就自己写了一个
2.在全局注册LocaleController
代码如下:
class MyApp extends StatelessWidget {
MyApp({super.key});
LocaleController localeController = Get.put(LocaleController());
// This widget is the root of your application.
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'Paradise',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyTabBar(),
translations: Messages(),
locale: localeController.locale.value,
fallbackLocale: const Locale('zh', 'CN'),
);
}
}
3.在其他地方使用LocaleController
代码如下:
String? _selectedLocale;
final LocaleController _localeController = Get.find();
void initState() {
super.initState();
// ...
_selectedLocale = _localeController.locale.string;
}
_selectedLocale是LocaleController里的locale值,在initState中赋初值
当用户选择更换语言时调用LocaleController的setLocale即可
_localeController.setLocale(languageTag);