到目前为止,我们已经添加了两个部件:按钮和文本框,并对代码进行了优化。本文继续增加一个新部件:日期选择。
启动 Android Studio,打开 hello_world
项目,运行虚拟机,这样就可以实时看到编码产生的效果。现在,我们的部件
页面展示了文本框和按钮两个部件。
打开日期选择对话框
- 在
lib/widget
文件夹下,打开my_widgets.dart
文件,定位到下列代码:
dart
MaterialButton buildMaterialButton() {
- 在这一行代码的上方,添加下列代码:
dart
Widget buildDateField(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'日期',
style: TextStyle(fontSize: 20),
),
TextButton(
child: const Text('选择', style: TextStyle(fontSize: 20),),
onPressed: () async {
final currentDate = DateTime.now();
showDatePicker(
context: context,
initialDate: currentDate,
firstDate: currentDate,
lastDate: DateTime(currentDate.year + 5),
);
},
),
],
),
],
);
}
- 继续在
my_widgets.dart
文件中,定位到下列代码:
dart
buildMaterialButton(),
- 在这一行代码的上方,添加下列代码:
dart
buildDateField(context),
- 热重启项目。点击
部件
导航图标,页面上出现了日期选择
的按钮。
- 点击
选择
按钮,会弹出日期选择对话框。
选择日期,点击OK
按钮后,对话框自动关闭,但是选择的日期并没有显示出来。接下来,我们就解决这个问题。
显示选择的日期
- 继续在
my_widgets.dart
文件中,定位到下列代码:
dart
final _textController = TextEditingController();
- 在这一行代码的下方,添加下面的代码:
dart
DateTime _dueDate = DateTime.now();
- 继续在
my_widgets.dart
文件中,定位到下列代码:
dart
showDatePicker(
- 把这一行代码,替换为以下代码:
dart
final selectedDate = await showDatePicker(
- 继续在
my_widgets.dart
文件中,定位到下列代码:
dart
lastDate: DateTime(currentDate.year + 5),
);
- 在这两行代码的下方,添加下面的代码:
dart
setState(() {
if (selectedDate != null) {
_dueDate = selectedDate;
}
});
- 继续在
my_widgets.dart
文件中,定位到下列代码:
dart
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'日期',
style: TextStyle(fontSize: 20),
),
TextButton(
child: const Text('选择', style: TextStyle(fontSize: 20),),
onPressed: () async {
final currentDate = DateTime.now();
final selectedDate = await showDatePicker(
context: context,
initialDate: currentDate,
firstDate: currentDate,
lastDate: DateTime(currentDate.year + 5),
);
setState(() {
if (selectedDate != null) {
_dueDate = selectedDate;
}
});
},
),
],
),
- 在这块代码的下方,添加下面的代码:
dart
Text(_dueDate.toString()),
- 热重启项目。点击
部件
导航图标,点击选择
按钮,选择一个日期,点击OK
按钮,这时,日期显示在了页面上。
格式化日期显示
现在,页面上已经显示出用户选择的日期,但是我们希望只显示日期的年月日部分,所以还需要对日期内容进行格式化。
- 打开
pubspec.yaml
文件,定位到下列代码:
dart
dependencies:
flutter:
sdk: flutter
- 在这块代码的下方,添加一行代码
intl: ^0.18.1
, 如下所示:
dart
dependencies:
flutter:
sdk: flutter
intl: ^0.18.1
注意:务必让 flutter:
和 intl: ^0.18.1
缩进保持一致。
- 点击文件上方的
Pub get
按钮,下载依赖软件包:
- 打开
my_widgets.dart
文件,在文件的起始位置,添加如下导入语句:
dart
import 'package:intl/intl.dart';
- 继续在
my_widgets.dart
文件中,定位到下列代码:
dart
Text(_dueDate.toString()),
- 把这一行代码,替换为以下代码:
dart
Text(DateFormat('yyyy-MM-dd').format(_dueDate)),
- 热重启项目。重新选择一个日期,效果如下图所示:
本地化日期选择
日期选择功能已经大功告成,但美中不足的是,日期选择页面的文字是英语。虽然容易看懂,但是与应用使用的中文语言有些格格不入。现在就来本地化这个日期选择对话框。
- 打开
pubspec.yaml
文件,定位到下列代码:
yaml
intl: ^0.18.1
- 在这一行代码的下面,添加如下代码:
dart
flutter_localizations:
sdk: flutter
注意:代码缩进。
-
点击文件上方的
Pub get
按钮,下载依赖软件包。 -
打开
main.dart
文件,定位到下列代码:
dart
title: 'Hello World Flutter App',
如果没有找到,可能是之前没有修改过这行代码,需要定位到下列代码:
dart
title: 'Flutter Demo',
- 在这行代码的下面,添加如下代码:
dart
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: const [
Locale('zh', 'CH'),
Locale('en', 'US'),
],
locale: const Locale('zh'),
- 打开
my_widgets.dart
文件,定位到下列代码:
dart
lastDate: DateTime(currentDate.year + 5),
- 在这行代码的下面,添加如下代码:
dart
locale: const Locale('zh')
- 热重启项目。重新打开日期选择框,效果如下图所示:
提交代码
我们已经实现了日期的选择,又到达了一个小小的里程碑,应该对代码进行提交,保持良好编程习惯。
shell
git add .
git commit -m '选择并显示日期。'