flutter_pickers
![GitHub forks]()
flutter 选择器库,包括日期及时间选择器(可设置范围)、单项选择器(可用于性别、民族、学历、星座、年龄、身高、体重、温度等)、城市地址选择器(分省级、地级及县级)、多项选择器等…… 欢迎Fork & pr贡献您的代码,大家共同学习
Example
Web版在线Demo
flutter.eeaarr.cn (上面进不去 试试这个)
![]()
用法
1.Depend
dependencies:
flutter_pickers: ^2.2.0
2.Get
$ flutter packages get
3.Install
import 'package:flutter_pickers/pickers.dart';
目录
地址选择器
Pickers.showAddressPicker()
- 支持三级联动
- 支持自定义颜色、大小等样式
- 支持显示 '全部' 选项
- 支持只选择 省市 2级
- 支持查询城市码
- 实时回调
简单使用
String initProvince = '四川省', initCity = '成都市', initTown = '双流区';
Widget _checkLocation() {
return InkWell(
onTap: () {
Pickers.showAddressPicker(
context,
initProvince: initProvince,
initCity: initCity,
initTown: initTown,
onConfirm: (p, c, t) {
setState(() {
initProvince = p;
initCity = c;
initTown = t;
});
},
);
},
child: Text('$initProvince - $initCity - $initTown'));
}
- initTown : 不设置或者设置为null ,不显示区级
更多用法
demo address_picker_page.dart
AddressPicker.showPicker(
context,
initProvince: locations2[0],
initCity: locations2[1],
initTown: locations2[2],
showTitlebar: true,
menu: _headMenuView,
menuHeight: 36.0,
title: title,
cancelWidget: _cancelButton,
commitWidget: _commitButton,
headDecoration: headDecoration,
addAllItem: false,
textColor: Colors.white,
backgroundColor: Colors.grey[800],
onConfirm: (p, c, t) {},
);
| 参数 |
描述 |
默认 |
| initProvince |
初始化 省 |
'' |
| initCity |
初始化 市 |
'' |
| initTown |
初始化 区 |
'' |
| pickerStyle |
详见样式 |
DefaultPickerStyle() |
| onChanged |
选择器发生变动 return (String province, String city, String town) |
null |
| onConfirm |
选择器提交 return (String province, String city, String town) |
null |
| onCancel |
选择器取消 return (bool isCancel) 是否通过点击取消按钮关闭 |
null |
| addAllItem |
市、区是否添加 '全部' 选项 |
true |
更多方法
List<String> cityCode = Address.getCityCodeByName(provinceName:'四川省', cityName: '成都市', townName: '武侯区');
return [510000,510100,510104] or [510000,510000] or [510000] or []
List<String> cityName = Address.getCityNameByCode(provinceCode: "510000", cityCode: "510100", townCode: "510104");
return [四川省, 成都市, 锦江区] or [四川省, 成都市] or [四川省] or []
单项选择器
Pickers.showSinglePicker()请戳我查看demo代码
![]()
简单使用.
String initData = 'PHP';
Widget _demo() {
return InkWell(
onTap: () {
Pickers.showSinglePicker(context,
data: ['PHP', 'JAVA', 'C++', 'Dart', 'Python', 'Go'],
selectData: initData,
onConfirm: (p, position) {
setState(() {
initData = p;
});
}, onChanged: (p) => debugPrint('数据发生改变:$p'));
},
child: Text('$initData'));
}
| 参数 |
描述 |
默认 |
| data |
数据源 |
null |
| selectData |
选中的数据 |
'' |
| pickerStyle |
详见样式 |
DefaultPickerStyle() |
| onChanged |
选择器发生变动 return (String data,int position) |
null |
| onConfirm |
选择器提交 return (String data,int position) |
null |
| onCancel |
选择器取消 return (bool isCancel) 是否通过点击取消按钮关闭 |
null |
内置数据
可直接传给 data:PickerDataType.sex
- sex // 性别
- education // 学历
- subject // 学科
- constellation // 星座
- zodiac // 生肖
- ethnicity // 民族
多项选择器(无联动)
Pickers.showMultiPicker() 请戳我查看demo代码
![]()
示例代码
final timeData = [
['上午', '下午'],
List.generate(12, (index) => (index + 1).toString()).toList(),
List.generate(60, (index) => index.toString()).toList(),
List.generate(60, (index) => index.toString()).toList(),
];
void _showDemo(){
Pickers.showMultiPicker(
context,
data: timeData,
selectData: timeData2Select,
suffix: ['', '时', '分', '秒'],
onConfirm: (p) {
debugPrint('longer >>> 返回数据类型:${p.map((x) => x.runtimeType).toList()}');
},
);
}
| 参数 |
描述 |
默认 |
| data |
数据源 |
null |
| selectData |
选中的数据 |
'' |
| suffix |
item后缀 |
null |
| pickerStyle |
详见样式 |
DefaultPickerStyle() |
| onChanged |
选择器发生变动 return (List data, List position) |
null |
| onConfirm |
选择器提交 return (List data, List position) |
null |
| onCancel |
选择器取消 return (bool isCancel) 是否通过点击取消按钮关闭 |
null |
多项选择器(联动)
Pickers.showMultiLinkPicker() 请戳我查看demo代码
示例代码
void _showPicker() {
var multiData = {
'a': {
'aa': [1, 'ww'],
'aaa': 10086
},
'b': ['bbb', 'bbbbb'],
'c': {
'cc': {
'ccc333': [111, 1111],
'cccc33': {
'ccccc4': '帮忙star',
'ccc4-2': [4442, 44442, 442]
},
},
'cc2': ['ccc', 123],
'cc3': 'star 鼓励'
}
};
Pickers.showMultiLinkPicker(
context,
data: multiData,
selectData: ['c', 'cc3'],
columnNum: 5,
suffix: ['', '', '', '', ''],
onConfirm: (List p) {
debugPrint('longer >>> 返回数据:${p.join('、')}');
debugPrint('longer >>> 返回数据类型:${p.map((x) => x.runtimeType).toList()}');
},
);
}
| 参数 |
描述 |
默认 |
| columnNum |
选择器列数(必填) |
null |
| data |
数据源 |
null |
- 和上面的多项选择器(无联动)差不多,就不多介绍,改动了2个字段
- 最外层必须是map(既然是多项,你至少得2列吧)
- map类型 说明还有下一列,如果是list或者string、num 表示已经达到最后一级
时间选择器
Pickers.showDatePicker() 请戳我查看demo代码
- 16种模式「年月日时分秒」
- 自定义后缀
- 最大|最小 时间
- 自定义显示样式
![]()
![]()
简单使用..
Widget demo() {
return FlatButton(
onPressed: () {
Pickers.showDatePicker(
context,
onConfirm: (p) {
print('longer >>> 返回数据:$p');
},
);
},
child: Text('Demo'));
}
更多方法.
Pickers.showDatePicker(
context,
mode: DateMode.HMS,
suffix: Suffix(hours: ' 小时', minutes: ' 分钟', seconds: ' 秒'),
pickerStyle: pickerStyle,
selectDate: PDuration(hour: 18, minute: 36, second: 36),
minDate: PDuration(hour: 12, minute: 38, second: 3),
maxDate: PDuration(hour: 12, minute: 40, second: 36),
onConfirm: (p) {
print('longer >>> 返回数据:$p');
},
);
| 参数 |
描述 |
默认 |
| mode |
时间选择器所显示样式 16 种时间样式 |
DateMode.YMD |
| selectData |
PDuration()初始化选中时间 |
默认现在:PDuration.now() |
| minDate |
PDuration()最小时间 |
PDuration(year: 1900) |
| maxDate |
PDuration()最大时间 |
PDuration(year: 2100) |
| suffix |
每列时间对应的单位 |
Suffix.normal() |
| pickerStyle |
详见样式 |
DefaultPickerStyle() |
| onChanged |
选择器发生变动 return (PDuration data) |
null |
| onConfirm |
选择器提交 return (PDuration data) |
null |
| onCancel |
选择器取消 return (bool isCancel) 是否通过点击取消按钮关闭 |
null |
参数说明
selectDate,minDate,maxDate 和返回的数据类型 都是PDuration()
PDuration(year: 2020, month: 1, day: 4, hour: 12, minute: 40, second: 36);
PDuration.parse(DateTime.parse('20210139'));
PDuration.now();
enum DateMode {
YMDHMS,
YMDHM,
YMDH,
YMD,
YM,
Y,
MDHMS,
MDHM,
MDH,
MD,
HMS,
HM,
MS,
S,
M,
H
}
tip
- 如果用到了日期,selectData需要传入年,不然无法计算,如果没有,会默认当前年
- 当只有单列数据,min|max限制不产生关联 只针对单列item限制,比如 maxDate: day=3, minDate: day=10, 那么day只显示3-10之间
- 如果minDate:year: 2020, month: 2, day: 10, 只显示2020年2月10日之后的
- minDate|maxDate 的YMD和HMS 没有关联! 没有关联!比如设置maxDate:year: 2020, month: 2, day: 10, hour:8,不是2020年2月10日8时之后的时间
样式
内置样式
style_picker_page.dart 请戳我查看demo代码
default_style.dart 源码
- 以下4种样式是使用 PickerStyle 类进行封装的。
- 都内置了夜间模式,如 NoTitleStyle.dark()
- 除了NoTitleStyle, 其它的样式可以传入
- haveRadius: 是否圆角
- title: 标题
- color: 确定按钮颜色
![样式1]() |
![样式1]() |
| 默认样式:DefaultPickerStyle() |
默认样式(暗色):DefaultPickerStyle.dark() |
|
|
![样式2]() |
![样式2]() |
| 无标题样式:NoTitleStyle() |
无标题样式(暗色):NoTitleStyle.dark() |
|
|
![样式3]() |
![样式3]() |
| 关闭按钮样式:ClosePickerStyle() |
关闭按钮样式(暗色):ClosePickerStyle.dark() |
|
|
![样式4]() |
![样式4]() |
| 圆角按钮样式:RaisedPickerStyle() |
圆角按钮样式(暗色):RaisedPickerStyle.dark() |
自定义样式
style_picker_page.dart 请戳我查看demo代码
picker_style.dart 样式基类
class PickerStyle {}
其他参数
License
flutter_pickers 使用 MIT 许可证,详情见 LICENSE 文件。