最近一段时间,写了一个项目,使用的getx 框架,但是在使用系统日历的时候,需求需要日历有多语言功能,但是showDatePicker 日历组件,无法使用getx 里面的Locale 设置,强制使用的话,只会崩溃报错,报错原因就是需要我们在MaterialApp 里面配置多语言。
下面是我给如上问题的一些解决方案,如果你有更好的方式,请留言告知,万分感谢
showDatePicker() 方法用于弹出一个日期选择器的对话框,对话框会有一个默认的样式,当然,我们也可以使用builder 来自定义样式,如下列表中的属性,就是我们常用的一些属性了。
| 属性名 | 类型 | 功能说明 |
|---|---|---|
| context | BuildContext | 设置BuildContext |
| initialDate | DateTime | 设置日期选择器打开时默认日期 |
| firstDate | DateTime | 设置日期选择器可选择的起始日期 |
| lastDate | DateTime | 设置日期选择器可选择的终止日期 |
| local | Locale | 设置国际化,默认英文 |
| selectableDayPredicate | bool | 设置日期选择器可选的日期 |
| builder | Widget | 设置日期选择器主题.标题栏等样式 |
当我们需要使用的时候,直接在事件中调用
showdata(context) {
showDatePicker(
context: context,
initialDate: DateTime.now(),
lastDate: DateTime.now(),
firstDate: DateTime(1900, 01, 01));
}
当然,上面是最简单的使用方法,并不是本篇文章的重点解决方案,接下来我们先来看一个在正常情况下使用,怎么设置多语言切换功能。
flutter_localizations:
sdk: flutter
void main() {
runApp(
new MaterialApp(
title: 'app',
theme: new ThemeData(
primaryColor: Colors.white,
),
home: new MyLoginWidget(),
localizationsDelegates: [
//此处 系统是什么语言就显示什么语言
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
//此处 系统是什么语言就显示什么语言
const Locale('zh', 'CH'),
const Locale('en', 'US'),
],
),
);
}
_showDatePicker() async{
var date =await showDatePicker(
context: context,
initialDate: _datetime,
firstDate:DateTime(1900),
lastDate:DateTime(2050),
locale: Locale('zh'), // 强制显示中文 如果报错就删除,跟随系统语言显示
);
if(date==null) return;
print(date);
setState(() {
_datetime=date;
});
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeMg4itq-1667462092245)(/Users/tiger/Library/Application Support/typora-user-images/image-20221103155132705.png)]](https://1000bd.com/contentImg/2024/04/30/30e3c90312449884.png)
如上便是我们在正常环境下,使用的 showDatePicker() 并设置多语言的方式,下面我们再来看,如何在getx 组件中设置多语言
flutter_localizations:
sdk: flutter
GetMaterialApp(
theme: TigerTheme.themeData(),
debugShowCheckedModeBanner: false,
title: "App",
initialRoute: "/",
getPages: GetPages.getPages,
localizationsDelegates: const [ // localizationsDelegates delegate 必须得设置
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
);
_showDatePicker() async{
var date =await showDatePicker(
context: context,
initialDate: selectedDate != null
? DateTime.parse(selectedDate.toString())
: DateTime.now(),
firstDate: DateTime(2015, 8),
lastDate: DateTime(2101),
locale: const Locale('de', 'US')); // 在此设置多语言功能
}
在showTimePicker() 组件中,我们会发现没有Locale 这个语言设置功能,那么我们该怎么来设置语言呢?
_showTimePicker() async{
final picked = await showTimePicker(
context: context,
initialTime: selectedTime,
builder: (context, child) {
return Localizations(
locale: const Locale('de', 'US'),
delegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
child: child);
});
}
如上代码中所示,我们可以重写他的builder 属性,来自定义一个Localizations 组件,这样我们就实现了 showTimePicker 时间选择器的多语言功能了。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xbaiYnqN-1667462092248)(/Users/tiger/Library/Application Support/typora-user-images/image-20221103155159730.png)]](https://1000bd.com/contentImg/2024/04/30/c0890d57836e3b80.png)
在遇到这个这个问题的时候,我也查询了很多资料,也反复的去查看了getx 的源码部分,浪费了很多的时间,才解决了此问题,如果对你有帮助,别忘了点赞支持一下哦!