flutter 选择器库,包括日期及时间选择器(可设置范围)、单项选择器(可用于性别、民族、学历、星座、年龄、身高、体重、温度等)、城市地址选择器(分省级、地级及县级)、多项选择器等

flutter_pickers

github:https://github.com/longer96/flutter_pickers

欢迎Fork & pr贡献您的代码,大家共同学习

Example

Web版在线Demo

gif1.gif
gif2.gif
gif3.gif
gif4.gif

用法

1.Depend

dependencies: 
    flutter_pickers: ^1.0.0

2.Get

$ flutter packages get

3.Install

import 'package:flutter_pickers/pickers.dart';

目录

地址选择器

Pickers.showAddressPicker()

  • 支持三级联动
  • 支持自定义颜色、大小等样式
  • 支持显示 '全部' 选项
  • 支持只选择 省市 2级
  • 支持查询城市码
  • 实时回调
pic1.png
pic2.png
三级选择器动图 二级静态图

简单使用

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) {},
);
pic3.png
参数 描述 默认
initProvince 初始化 省 ''
initCity 初始化 市 ''
initTown 初始化 区 ''
pickerStyle 详见样式 DefaultPickerStyle()
onChanged 选择器发生变动 return (String province, String city, String town) null
onConfirm 选择器提交 return (String province, String city, String town) null
addAllItem 市、区是否添加 '全部' 选项 true

更多方法

/// 根据城市名 查询城市code(有先后顺序)
List<String> cityCode =  Locations.getTownsCityCode("四川省","成都市","锦江区");
return [510000,510100,510104]  or  [510000,510000]  or [510000]  or  []


/// 通过城市code 查询城市名(有先后顺序)
List<String> cityName =  Locations.getCityNameByCode("510000","510100","510104");
return [四川省, 成都市, 锦江区]  or  [四川省, 成都市]  or [四川省] or []

单项选择器

Pickers.showSinglePicker()请戳我查看demo代码

  • 单选和多选支持数据源混传 num string
pic4.png
pic5.png
pic6.png

简单使用.

String initData = 'PHP';
Widget _demo() {
    return InkWell(
    onTap: () {
      Pickers.showSinglePicker(context,
          data: ['PHP', 'JAVA', 'C++', 'Dart', 'Python', 'Go'],
          selectData: initData,
          onConfirm: (p) {
            setState(() {
              initData = p;
            });
          }, onChanged: (p) => print('数据发生改变:$p'));
    },
    child: Text('$initData'));
}
参数 描述 默认
data 数据源 null
selectData 选中的数据 ''
pickerStyle 详见样式 DefaultPickerStyle()
onChanged 选择器发生变动 return (String data) null
onConfirm 选择器提交 return (String data) null

内置数据

可直接传给 data:PickerDataType.sex

  • sex // 性别
  • education // 学历
  • subject // 学科
  • constellation // 星座
  • zodiac // 生肖
  • ethnicity // 民族

多项选择器

Pickers.showMultiplePicker() 请戳我查看demo代码

pic7.png
pic8.png

示例代码

  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.showMultiplePicker(
      context,
      data: timeData,
      selectData: timeData2Select,
      suffix: ['', '时', '分', '秒'],
      onConfirm: (p) {
        print('longer >>> 返回数据类型:${p.map((x) => x.runtimeType).toList()}');
      },
    );
  }
参数 描述 默认
data 数据源 null
selectData 选中的数据 ''
suffix item后缀 null
pickerStyle 详见样式 DefaultPickerStyle()
onChanged 选择器发生变动 return (List data) null
onConfirm 选择器提交 return (List data) null

时间选择器

Pickers.showDatePicker() 请戳我查看demo代码

  • 16种模式「年月日时分秒」
  • 自定义后缀
  • 最大|最小 时间
  • 自定义显示样式
pic9.png
pic10.png
pic11.png
pic12.png
pic13.png
pic14.png

简单使用..

Widget demo() {
    return FlatButton(
    onPressed: () {
      Pickers.showDatePicker(
        context,
        onConfirm: (p) {
          print('longer >>> 返回数据:$p');
        },
        // onChanged: (p) => print(p),
      );
    },
    child: Text('Demo'));
}

更多方法.

    Pickers.showDatePicker(
      context,
      // 模式,详见下方
      mode: DateMode.HMS,
      // 后缀 默认Suffix.normal(),为空的话Suffix()
      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');
      },
      // onChanged: (p) => print(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

参数说明

  • PDuration()

selectDate,minDate,maxDate 和返回的数据类型 都是PDuration()

    // 可以自定义设置年月日时分秒
    PDuration(year: 2020, month: 1, day: 4, hour: 12, minute: 40, second: 36);
    // 设置DateTime类型
    PDuration.parse(DateTime.parse('20210139'));
    PDuration.now();
  • DateMode
    时间选择器所显示样式
  /// 时间选择器 所显示样式
  enum DateMode {
    /// 【yyyy-MM-dd HH:mm:ss】年月日时分秒
    YMDHMS,
    /// 【yyyy-MM-dd HH:mm】年月日时分
    YMDHM,  
    /// 【yyyy-MM-dd HH】年月日时
    YMDH,  
    /// 【yyyy-MM-dd】年月日
    YMD,  
    /// 【yyyy-MM】年月
    YM,  
    /// 【yyyy】年
    Y,  
    /// 【MM-dd HH:mm:ss】月日时分秒
    MDHMS,  
    /// 【MM-dd HH:mm】月日时分
    MDHM,  
    /// 【MM-dd HH:mm】月日时
    MDH,  
    /// 【MM-dd】月日
    MD,  
    /// 【HH:mm:ss】时分秒
    HMS,  
    /// 【HH:mm】时分
    HM,  
    /// 【mm:ss】分秒
    MS,  
    /// 【ss】秒
    S,  
    /// 【MM】月
    M,  
    /// 【HH】时
    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: 确定按钮颜色
s1-1.png
s1-2.png
默认样式:DefaultPickerStyle() 默认样式(暗色):DefaultPickerStyle.dark()
s2-1.png
s2-2.png
无标题样式:NoTitleStyle() 无标题样式(暗色):NoTitleStyle.dark()
s3-1.png
s3-2.png
关闭按钮样式:ClosePickerStyle() 关闭按钮样式(暗色):ClosePickerStyle.dark()
s4-1.png
s4-2.png
圆角按钮样式:RaisedPickerStyle() 圆角按钮样式(暗色):RaisedPickerStyle.dark()

自定义样式

style_picker_page.dart 请戳我查看demo代码
picker_style.dart 样式基类

style_mark.png
/// [showTitleBar] 是否显示头部(选择器以上的控件) 默认:true
/// [menu] 头部和选择器之间的菜单widget,默认null 不显示
/// [title] 头部 中间的标题  默认SizedBox() 不显示
/// [pickerHeight] 选择器下面 picker 的整体高度  固定高度:220.0
/// [pickerTitleHeight]  选择器上面 title 确认、取消的整体高度  固定高度:44.0
/// [pickerItemHeight]  选择器每个被选中item的高度:40.0
/// [menuHeight]  头部和选择器之间的菜单高度  固定高度:36.0
/// [cancelButton]  头部的取消按钮
/// [commitButton]  头部的确认按钮
/// [textColor]  选择器的文字颜色 默认黑色
/// [backgroundColor]  选择器的背景颜色 默认白色
/// [headDecoration] 头部Container 的Decoration   默认:BoxDecoration(color: Colors.white)

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

推荐阅读更多精彩内容