注册

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

前言

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

















123
image.pngimage.pngimage.png



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

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

















主界面选择器界面保存后界面
1771665361328_.pic.jpg1761665361327_.pic.jpg1751665361327_.pic.jpg

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



























参数类型描述
contextBuildContext构建上下文
firstDateDateTime可选择的最早日期
lastDateDateTime可选择的最晚日期

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_.pic.jpg1791665362162_.pic.jpg

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


dependencies:
flutter_localizations:
sdk: flutter

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


image.png


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


image.png


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


image.png




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

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

















123
1821665363618_.pic.jpg1821665363618_.pic.jpg1821665363618_.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.pngimage.png



4. 源码简看

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


image.png


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


image.png




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


image.png


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


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



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















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

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


image.png


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


image.png


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



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



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



作者:张风捷特烈
链接:https://juejin.cn/post/7153054582162063390
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册