一開始用的是intl插件,配置插件生成的語言包文件完成多語言,但個(gè)別頁面刷新需要自己處理,不知是否是用了bool get wantKeepAlive => true;保留頁面狀態(tài)的原因。
現(xiàn)在換成GetX插件提供的國際化功能,非常好用
import 'package:get/get.dart';
在main.dart的build方法里配置getx:
GetMaterialApp(
translations: IntlMsgs(), // 國際化語言包
locale: Locale('zh', 'CN'),
fallbackLocale: Locale('en', 'US'),
localeListResolutionCallback: (locales, supportedLocales) {
print('當(dāng)前系統(tǒng)語言環(huán)境:$locales');
return;
},
...
可以看到MaterialApp替換成了GetMaterialApp,translations參數(shù)配置了一個(gè)自定義的語言包文件,舉個(gè)例子:
class IntlMsgs extends Translations {
@override
Map<String, Map<String, String>> get keys => {
'zh_CN': {
'english': '英文',
},
'en_US': {
'english': 'english',
},
};
}
創(chuàng)建一個(gè)類繼承自Translations,重寫keys的get方法,在里面配置多種語言的字段,上面的代碼只配置了一個(gè)english字段,支持中文和英文,我們在使用的時(shí)候就可以:
Text(
'english'.tr,
),
字符串后面加個(gè) .tr 就行了,getx會(huì)根據(jù)當(dāng)前語言環(huán)境獲取對應(yīng)的字段
我們在切換語言的時(shí)候,只需要:
Get.updateLocale(Locale('en_US'));
就切換到英文了,因?yàn)間etx自帶狀態(tài)管理,我們不需要考慮頁面刷新
下面說深色模式,也是只需要一行:
Get.changeTheme(isDark
? ThemeData(
brightness: Brightness.dark,
primaryColor: Utils.hexColor('2c2c2b'),
)
: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.white,
));
可以用Get.isDarkMode來獲取當(dāng)前是否是深色模式

image.png

image.png