Flutter 3 基础11: 选择并显示日期

到目前为止,我们已经添加了两个部件:按钮和文本框,并对代码进行了优化。本文继续增加一个新部件:日期选择。

启动 Android Studio,打开 hello_world 项目,运行虚拟机,这样就可以实时看到编码产生的效果。现在,我们的部件页面展示了文本框和按钮两个部件。

打开日期选择对话框

  1. lib/widget 文件夹下,打开 my_widgets.dart 文件,定位到下列代码:
dart 复制代码
MaterialButton buildMaterialButton() {
  1. 在这一行代码的上方,添加下列代码:
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),  
              );  
            },  
          ),  
        ],  
      ),
    ],  
  );  
}
  1. 继续在 my_widgets.dart 文件中,定位到下列代码:
dart 复制代码
buildMaterialButton(),
  1. 在这一行代码的上方,添加下列代码:
dart 复制代码
buildDateField(context),
  1. 热重启项目。点击部件导航图标,页面上出现了日期选择的按钮。
  1. 点击选择按钮,会弹出日期选择对话框。

选择日期,点击OK按钮后,对话框自动关闭,但是选择的日期并没有显示出来。接下来,我们就解决这个问题。

显示选择的日期

  1. 继续在 my_widgets.dart 文件中,定位到下列代码:
dart 复制代码
final _textController = TextEditingController();
  1. 在这一行代码的下方,添加下面的代码:
dart 复制代码
DateTime _dueDate = DateTime.now();
  1. 继续在 my_widgets.dart 文件中,定位到下列代码:
dart 复制代码
showDatePicker(
  1. 把这一行代码,替换为以下代码:
dart 复制代码
final selectedDate = await showDatePicker(
  1. 继续在 my_widgets.dart 文件中,定位到下列代码:
dart 复制代码
  lastDate: DateTime(currentDate.year + 5),  
);
  1. 在这两行代码的下方,添加下面的代码:
dart 复制代码
setState(() {
  if (selectedDate != null) {
    _dueDate = selectedDate;
  }
});
  1. 继续在 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;
          }
        });
      },
    ),
  ],
),
  1. 在这块代码的下方,添加下面的代码:
dart 复制代码
Text(_dueDate.toString()),
  1. 热重启项目。点击部件导航图标,点击选择按钮,选择一个日期,点击 OK 按钮,这时,日期显示在了页面上。

格式化日期显示

现在,页面上已经显示出用户选择的日期,但是我们希望只显示日期的年月日部分,所以还需要对日期内容进行格式化。

  1. 打开 pubspec.yaml 文件,定位到下列代码:
dart 复制代码
dependencies:  
  flutter:  
    sdk: flutter
  1. 在这块代码的下方,添加一行代码 intl: ^0.18.1, 如下所示:
dart 复制代码
dependencies:  
  flutter:  
    sdk: flutter
  intl: ^0.18.1

注意:务必让 flutter:intl: ^0.18.1 缩进保持一致。

  1. 点击文件上方的 Pub get 按钮,下载依赖软件包:
  1. 打开 my_widgets.dart 文件,在文件的起始位置,添加如下导入语句:
dart 复制代码
import 'package:intl/intl.dart';
  1. 继续在 my_widgets.dart 文件中,定位到下列代码:
dart 复制代码
Text(_dueDate.toString()),
  1. 把这一行代码,替换为以下代码:
dart 复制代码
Text(DateFormat('yyyy-MM-dd').format(_dueDate)),
  1. 热重启项目。重新选择一个日期,效果如下图所示:

本地化日期选择

日期选择功能已经大功告成,但美中不足的是,日期选择页面的文字是英语。虽然容易看懂,但是与应用使用的中文语言有些格格不入。现在就来本地化这个日期选择对话框。

  1. 打开 pubspec.yaml 文件,定位到下列代码:
yaml 复制代码
intl: ^0.18.1
  1. 在这一行代码的下面,添加如下代码:
dart 复制代码
flutter_localizations:  
  sdk: flutter

注意:代码缩进。

  1. 点击文件上方的 Pub get 按钮,下载依赖软件包。

  2. 打开 main.dart 文件,定位到下列代码:

dart 复制代码
title: 'Hello World Flutter App',

如果没有找到,可能是之前没有修改过这行代码,需要定位到下列代码:

dart 复制代码
title: 'Flutter Demo',
  1. 在这行代码的下面,添加如下代码:
dart 复制代码
localizationsDelegates: const [  
  GlobalMaterialLocalizations.delegate,  
  GlobalCupertinoLocalizations.delegate,  
  GlobalWidgetsLocalizations.delegate,  
],  
supportedLocales: const [  
  Locale('zh', 'CH'),  
  Locale('en', 'US'),  
],  
locale: const Locale('zh'),
  1. 打开 my_widgets.dart 文件,定位到下列代码:
dart 复制代码
lastDate: DateTime(currentDate.year + 5),
  1. 在这行代码的下面,添加如下代码:
dart 复制代码
locale: const Locale('zh')
  1. 热重启项目。重新打开日期选择框,效果如下图所示:

提交代码

我们已经实现了日期的选择,又到达了一个小小的里程碑,应该对代码进行提交,保持良好编程习惯。

shell 复制代码
git add .
git commit -m '选择并显示日期。'
相关推荐
呦呦鹿鸣Rzh9 分钟前
Web前端开发
前端
会说法语的猪2 小时前
uniapp使用uni.navigateBack返回页面时携带参数到上个页面
前端·uni-app
古蓬莱掌管玉米的神10 小时前
vue3语法watch与watchEffect
前端·javascript
林涧泣10 小时前
【Uniapp-Vue3】uni-icons的安装和使用
前端·vue.js·uni-app
雾恋10 小时前
AI导航工具我开源了利用node爬取了几百条数据
前端·开源·github
拉一次撑死狗10 小时前
Vue基础(2)
前端·javascript·vue.js
祯民11 小时前
两年工作之余,我在清华大学出版社出版了一本 AI 应用书籍
前端·aigc
热情仔11 小时前
mock可视化&生成前端代码
前端
m0_7482463511 小时前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端
wjs040611 小时前
用css实现一个类似于elementUI中Loading组件有缺口的加载圆环
前端·css·elementui·css实现loading圆环