Flutter第十五章(showDatePicker,showTimePicker,国际化适配,DateTime 时间格式转换)

版权声明:本文为作者原创书籍。转载请注明作者和出处,未经授权,严禁私自转载,侵权必究!!!

情感语录: 一眼就能看得到头,不是我们想要的生活,我们为之努力,不是为了飞黄腾达,睥睨群雄,而是努力让自己的生活多一种可能,给自己的未来多一份惊喜

欢迎来到本章节,上一章节介绍了Flutter 中的 弹窗使用,知识点回顾 戳这里 Flutter基础第十四章

本章主要介绍开发中的时间选择器,时间格式转换,国际化适配等。

本章简要:

1、showDatePicker、showTimePicker方法

2、国际化适配

3、DateTime 时间格式转换

一、showDatePicker、showTimePicker 方法

showDatePicker、showTimePicker 这个两个分别表示弹出 年月日时间 选择器的方法,这和见面介绍的 showDialog 类似,内部的样式我们无法直接修改,它是跟随系统的版本所决定。

1、showDatePicker

它是一个异步方法,如下:

    Future<DateTime> showDatePicker({
      @required BuildContext context,
      @required DateTime initialDate,
      @required DateTime firstDate,
      @required DateTime lastDate,
      SelectableDayPredicate selectableDayPredicate,
      DatePickerMode initialDatePickerMode = DatePickerMode.day,
      Locale locale,
      TextDirection textDirection,
      TransitionBuilder builder,
    })
常用属性:
    属性                      描述

    context                   上下文

    initialDate               初始化的日期(必传)

    firstDate                 起始日期(必传)

    lastDate                  结束日期(必传)

    initialDatePickerMode     year和day两种模式,year 表示弹出时默认只显示年份,day表示年月日

    Locale locale             语言配置
    
    textDirection             选择器上的文字从左还是从右开始排版(一般不用)

首先来看弹出一个 年月日的时间选择器,实例代码如下:

    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    
    class TimePickerPage extends StatefulWidget {
      TimePickerPage({Key key}) : super(key: key);
    
      _TimePickerPageState createState() => _TimePickerPageState();
    }
    
    class _TimePickerPageState extends State<TimePickerPage> {
      // 获取当前日期
      DateTime _nowDate = DateTime.now();
    
      _showDatePicker() {
        showDatePicker(
                //上下文
                context: context,
                //初始化日期
                initialDate: _nowDate,
                //起始日期 1999 年
                firstDate: DateTime(1999),
                //结束日期 2100
                lastDate: DateTime(2100)
             ).then((value) {
              if (value == null) {
                return;
              }
              setState(() {
                this._nowDate = value;
              });
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text("TimePickerPage"),
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      InkWell(
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            
                            Text("${_nowDate.year} 年 ${_nowDate.month} 月 ${_nowDate.day} 日"),
                            Icon(Icons.arrow_drop_down)
                          ],
                        ),
                        onTap: _showDatePicker,
                      ),
                    ],
                  )
                ],
              ),
            ));
      }
    }

效果如下:

showDatePicker.gif
2、showTimePicker

它也是一个异步方法,如下:

    Future<TimeOfDay> showTimePicker({
      @required BuildContext context,
      @required TimeOfDay initialTime,
      TransitionBuilder builder,
    })
常用属性;
    属性                      描述

    context                   上下文

    initialTime               初始化时间

实例代码:

  //设置一个指定时间
  var _nowTime = TimeOfDay(hour: 16, minute: 45);

  _showTimePicker() {
    showTimePicker(
        context: context,
        //初始化时间到指定的时间
        initialTime: _nowTime
    ).then((value) {
      if (value == null) {
        return;
      }
      setState(() {
        this._nowTime = value;
      });
    });
  }

效果如下:

showTimePicker.gif

二、国际化适配

可以看到上面的时间选择器都是英文的,这对于中国人来说很不符合使用习惯,因此需要做国际化适配。Flutter 只提供美式英语的本地化。如果想要添加其他语言,应用必须指定额外的 MaterialApp 属性并且添加一个单独的 package,叫做 flutter_localizations。截至到 2019 年 4 月份,这个 package 已经支持大约 52 种语言。

1、pubspec.yaml 加入库依赖
    dependencies:
    
      ..... 剩略其他库....

      #国际化适配
      flutter_localizations:
        sdk: flutter
2、导包
 import 'package:flutter_localizations/flutter_localizations.dart';
3、在 MaterialApp 中配置国际化
class MyApp extends StatelessWidget {

    @override
    Widget build(BuildContext context) {

      return MaterialApp(

          //国际化配置
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
          ],
          supportedLocales: [
            //配置语种
            const Locale('zh', 'CH'),
            const Locale('en', 'US'),
          ],

          //去掉debug图标
          debugShowCheckedModeBanner:false ,

          //初始化的时候加载的路由
          initialRoute: '/',
          onGenerateRoute: onGenerateRoute

      );
    }
  }

再次打开我们的时间选择器,验证国际化适配。效果如下:

语言配置后效果.gif
三、DateTime 时间格式转换

开发中对各种样式的时间格式处理 都需要用到 DateTime 类,它的默认构造函数就可以构造一个指定的 时间,如:
new DateTime(xxxx年, xx月, xx日, xx时, xx分,xx秒,...) 支持到 微妙,该类功能相当的强大。

默认构造函数
  DateTime(int year,
      [int month = 1,
      int day = 1,
      int hour = 0,
      int minute = 0,
      int second = 0,
      int millisecond = 0,
      int microsecond = 0])
      : this._internal(year, month, day, hour, minute, second, millisecond,
            microsecond, false);
世界标准时间(UTC) 命名构造函数
  DateTime.utc(int year,
      [int month = 1,
      int day = 1,
      int hour = 0,
      int minute = 0,
      int second = 0,
      int millisecond = 0,
      int microsecond = 0])
      : this._internal(year, month, day, hour, minute, second, millisecond,
            microsecond, true);
常用方法和属性
    方法名称                       描述

    now()                          命名构造,获取当前时间

    millisecondsSinceEpoch         获取 DateTime 中的时间 精确到毫秒 

    fromMillisecondsSinceEpoch     DateTime 转时间戳

    parse(timeString)              字符串转DateTime

    isBefore(date)                 时间比较---在之前

    isAfter(date)                  时间比较---在之后

    isAtSameMomentAs(date)         时间比较---相等

    compareTo(date)                时间比较---大于返回1;等于返回0;小于返回-1

    add(Duration)                  时间增加

    subtract(Duration)             时间减少

    difference(date)               时间差计算

    timeZoneName                   本地时区简码

    timeZoneOffset                 返回UTC与本地时差

    year、month、day、             年、月、日、时、分、秒、毫秒、微妙
    hour、minute、second、
    millisecond、microsecond
      
    weekday                        星期几

实例代码:

  void initState() {
    super.initState();

      //命名构造函数获取当前时间
      var currentTime = DateTime.now();
      print('当前时间是:$currentTime');

      //获取时间戳
      var timeStamp = currentTime.millisecondsSinceEpoch;
      print('当前时间戳:$timeStamp');

      // 时间戳转换成日期
      var date = DateTime.fromMillisecondsSinceEpoch(timeStamp);
      print('时间戳转日期:$date');


      //默认构造函数 构造时间
      var buildTime = new DateTime(2019, 10, 12, 15, 20,20);
      print("构造函数构造时间:$buildTime");

      // 字符串转date 只支持 “ - ” 拼接方式
      DateTime date2 = DateTime.parse("2019-12-20 14:30:33");
      print("时间字符串转DateTime $date2");
      // 时间比较

      print("date在date2之前: ${date.isBefore(date2)}");
      print("date在currentTime之后: ${date.isAfter(currentTime)}");
      print("currentTime和buildTime是否相等: ${currentTime.isAtSameMomentAs(buildTime)}");
      // 大于返回1;等于返回0;小于返回-1。
      print("时间比较结果: ${currentTime.compareTo(date)}");

      //时间增加
      var addDay = buildTime.add(new Duration(days: 3));
      print('buildTime 加3天:$addDay');

      //时间减少
      DateTime lessDay = buildTime.subtract(new Duration(days: 5));
      print('buildTime减5天:$lessDay');


      print('两个时间时差计算:${addDay.difference(lessDay)}');

      print('本地时区简码:${buildTime.timeZoneName}');

      print('返回UTC与本地时差:${buildTime.timeZoneOffset}');

      print('获取年月日:${buildTime.year} 年 ${buildTime.month} 月  ${buildTime.day} 日');

      //获取星期几
      print('周:${buildTime.weekday}');


    }

控制台输出结果如下:

    I/flutter: 当前时间是:2019-09-14 17:18:06.138663
    I/flutter: 当前时间戳:1568452686138
    I/flutter: 时间戳转日期:2019-09-14 17:18:06.138
    I/flutter: 构造函数构造时间:2019-10-12 15:20:20.000
    I/flutter: 时间字符串转DateTime 2019-12-20 14:30:33.000
    I/flutter: date在date2之前: true
    I/flutter: date在currentTime之后: false
    I/flutter: currentTime和buildTime是否相等: false
    I/flutter: 时间比较结果: 1
    I/flutter: buildTime 加3天:2019-10-15 15:20:20.000
    I/flutter: buildTime减5天:2019-10-07 15:20:20.000
    I/flutter: 两个时间时差计算:192:00:00.000000
    I/flutter: 本地时区简码:CST
    I/flutter: 返回UTC与本地时差:8:00:00.000000
    I/flutter: 获取年月日:2019 年 10 月  12 日
    I/flutter: 周:6

好了本章节到此结束,如有错误,请你留言指正, 谢谢大家观看,下章再会 O(∩_∩)O

实例源码地址: https://github.com/zhengzaihong/flutter_learn

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容