Flutter 组件集录 | 日期范围组件 - DateRangePickerDialog


theme: cyanosis

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 3 天,点击查看活动详情


前言

今天随手翻翻源码,突然看到 showDateRangePicker,心中狂喜。原来 Flutter 早已将 日期范围选择器 内置了,可能有些小伙伴已经知道,但应该还有一部分朋友不知道。想当年,为了日期范围选择可吃了不少坑。做为 Flutter 内置组件收集狂魔的我,自然要发篇文章来安利一下这个组件。另外,该组件已经收录入 FutterUnit ,可更新查看。

| 1 | 2 | 3| | --- | --- |--- | | image.png | image.png | image.png |


1. 日期范围选择器的使用

如下所示,是最简单的日期选择器操作示意:点击选择按钮时,触发下面代码中的 _show 方法:

| 主界面 | 选择器界面 | 保存后界面 | | --- | --- |--- | | 1771665361328<em>.pic.jpg | 1761665361327</em>.pic.jpg |1751665361327_.pic.jpg|

showDateRangePickerFlutter 内置的方法,用于弹出日期范围的对话框。其中必传的参数有三个:

| 参数 | 类型 | 描述| | --- | --- |--- | | context | BuildContext | 构建上下文 | | firstDate | DateTime | 可选择的最早日期 | | lastDate | DateTime | 可选择的最晚日期 |

image.png

该方法返回 DateTimeRange? 泛型的 Future 对象,如下代码所示:可以通过 async/await 来等待 showDateRangePicker 任务的完成,获取 DateTimeRange? 结果对象。

void _show() async { DateTime firstDate = DateTime(2021, 1, 1); DateTime lastDate = DateTime.now(); DateTimeRange? range = await showDateRangePicker( context: context, firstDate: firstDate, lastDate: lastDate, ); print(range); }


2. 日期范围选择器的语言

默认情况下,你会发现选择器是 英文 的(左图),怎么能改成中文呢?

| 英文 | 中文 | | --- | --- | | 1781665362161<em>.pic.jpg | 1791665362162</em>.pic.jpg |

默认情况下,应用是不支持多语言,对于日历这种内置组件的多语言,可以通过加入 flutter_localizations 依赖实现:

yaml dependencies: flutter_localizations: sdk: flutter

MaterialApp 中指定 localizationsDelegatessupportedLocales 。如果应用本身没有多语言的需求,可以指定只支持中文:

image.png

如果需要多语言,可以通过 locale 参数指定语言。如果未指定的话,会使用当前项目中的当前语言。

image.png

简单瞄一眼 showDateRangePicker 源码,可以看出 locale 非空时,会通过 Localizations.override 来让子树使用指定的 locale 语言:

image.png


3. 日期范围选择器的其他参数

除了默认的必需参数外,还有一些参数用于指定相关文字。下面三张图中标注了相关文本对应的位置,如果需要修改相关文字,设置对应参数即可:

| 1 | 2 | 3| | --- | --- |--- | | 1821665363618<em>.pic.jpg | 1821665363618</em>.pic.jpg| 1821665363618_.pic.jpg|


另外,showDateRangePicker 方法中可以传入 initialDateRange 设置弹出时的默认时间范围; currentDate 可以设置当前日期,如下右图的 8 日

DateTimeRange? range = await showDateRangePicker( context: context, firstDate: firstDate, lastDate: lastDate, initialDateRange: DateTimeRange( start: DateTime(2022, 10, 1), end: DateTime(2022, 10, 6), ), currentDate: DateTime(2022, 10, 8) );

| 未设置默认情况 | 设置默认值 | | --- | --- | | image.png | image.png |


4. 源码简看

showDateRangePicker 方法,本质上就是就是通过 showDialog 方法展示对话框:

image.png

其中的内容是 DateRangePickerDialog 组件,方法中的绝大多数参数都是为了创建 DateRangePickerDialog 对象而准备的。

image.png


DateRangePickerDialog 就是一个很普通的 StatefulWidget 的派生类:

image.png

依赖 _DateRangePickerDialogState 状态类进行组件构建。如果在开发中,DateRangePickerDialog 无法满足使用需求,可以将代码拷贝一份进行魔改。

dart @override State<DateRangePickerDialog> createState() => _DateRangePickerDialogState();


如下所示,可以在月份条目下叠放月份信息,看起来更直观;或者修改选中时的激活端点的装饰:

| 月份背景 | 修改端点装饰 | | --- | --- | | image.png | image.png |

如下稍微翻翻源码,可以找到每个月份是通过 _MonthItem 组件构建的,所以需要对条目进行魔改,就在这里处理:

image.png

_MonthItemState 中,有 _buildDayItem 方法,如下是两端激活处的 BoxDecoration 装饰对象。 Decoration 的自定义能力非常强, BoxDecoration 如果无法满足需求,可以通过自定义 Decoration 进行绘制。

image.png

抓住这些核心的构建处理场合,我们可以更灵活地根据具体需求来魔改。而不是让应用千篇一律,毕竟 Flutter 框架中封装的组件只能满足大多数的基本使用场景,并不能尽善尽美。

需求是无限的,变化也是无限的,能应对变化的只有变化本身,能操纵变化的是我们编程者。

希望通过本文可以让更多的朋友知道 DateRangePickerDialog 的存在,让你的日期选择需求变得简单。那本文就到这里,谢谢观看 ~


更多 Flutter 内置组件介绍,欢迎关注 《Flutter 组件集录》 专栏。

  • @张风捷特烈 2022.10.10 未允禁转
  • 我的 公众号: 编程之王
  • 我的 github 主页 : toly1994328
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值