flutter 選擇器庫斋竞,包括日期及時間選擇器(可設(shè)置范圍)倔约、單項(xiàng)選擇器(可用于性別、民族窃页、學(xué)歷跺株、星座、年齡脖卖、身高乒省、體重、溫度等)畦木、城市地址選擇器(分省級袖扛、地級及縣級)、多項(xiàng)選擇器等

flutter_pickers

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

歡迎Fork & pr貢獻(xiàn)您的代碼十籍,大家共同學(xué)習(xí)

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()

  • 支持三級聯(lián)動
  • 支持自定義顏色蛆封、大小等樣式
  • 支持顯示 '全部' 選項(xiàng)
  • 支持只選擇 省市 2級
  • 支持查詢城市碼
  • 實(shí)時回調(diào)
pic1.png
pic2.png
三級選擇器動圖 二級靜態(tài)圖

簡單使用

String initProvince = '四川省', initCity = '成都市', initTown = '雙流區(qū)';
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 : 不設(shè)置或者設(shè)置為null ,不顯示區(qū)級

更多用法

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
參數(shù) 描述 默認(rèn)
initProvince 初始化 省 ''
initCity 初始化 市 ''
initTown 初始化 區(qū) ''
pickerStyle 詳見樣式 DefaultPickerStyle()
onChanged 選擇器發(fā)生變動 return (String province, String city, String town) null
onConfirm 選擇器提交 return (String province, String city, String town) null
addAllItem 市勾栗、區(qū)是否添加 '全部' 選項(xiàng) true

更多方法

/// 根據(jù)城市名 查詢城市code(有先后順序)
List<String> cityCode =  Locations.getTownsCityCode("四川省","成都市","錦江區(qū)");
return [510000,510100,510104]  or  [510000,510000]  or [510000]  or  []


/// 通過城市code 查詢城市名(有先后順序)
List<String> cityName =  Locations.getCityNameByCode("510000","510100","510104");
return [四川省, 成都市, 錦江區(qū)]  or  [四川省, 成都市]  or [四川省] or []

單項(xiàng)選擇器

Pickers.showSinglePicker()請戳我查看demo代碼

  • 單選和多選支持?jǐn)?shù)據(jù)源混傳 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('數(shù)據(jù)發(fā)生改變:$p'));
    },
    child: Text('$initData'));
}
參數(shù) 描述 默認(rèn)
data 數(shù)據(jù)源 null
selectData 選中的數(shù)據(jù) ''
pickerStyle 詳見樣式 DefaultPickerStyle()
onChanged 選擇器發(fā)生變動 return (String data) null
onConfirm 選擇器提交 return (String data) null

內(nèi)置數(shù)據(jù)

可直接傳給 data:PickerDataType.sex

  • sex // 性別
  • education // 學(xué)歷
  • subject // 學(xué)科
  • constellation // 星座
  • zodiac // 生肖
  • ethnicity // 民族

多項(xiàng)選擇器

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 >>> 返回?cái)?shù)據(jù)類型:${p.map((x) => x.runtimeType).toList()}');
      },
    );
  }
參數(shù) 描述 默認(rèn)
data 數(shù)據(jù)源 null
selectData 選中的數(shù)據(jù) ''
suffix item后綴 null
pickerStyle 詳見樣式 DefaultPickerStyle()
onChanged 選擇器發(fā)生變動 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 >>> 返回?cái)?shù)據(jù):$p');
        },
        // onChanged: (p) => print(p),
      );
    },
    child: Text('Demo'));
}

更多方法.

    Pickers.showDatePicker(
      context,
      // 模式惨篱,詳見下方
      mode: DateMode.HMS,
      // 后綴 默認(rèn)Suffix.normal(),為空的話Suffix()
      suffix: Suffix(hours: ' 小時', minutes: ' 分鐘', seconds: ' 秒'),
      // 樣式  詳見下方樣式
      pickerStyle: pickerStyle,
      // 默認(rèn)選中
      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 >>> 返回?cái)?shù)據(jù):$p');
      },
      // onChanged: (p) => print(p),
    );
參數(shù) 描述 默認(rèn)
mode 時間選擇器所顯示樣式 16 種時間樣式 DateMode.YMD
selectData PDuration()初始化選中時間 默認(rèn)現(xiàn)在:PDuration.now()
minDate PDuration()最小時間 PDuration(year: 1900)
maxDate PDuration()最大時間 PDuration(year: 2100)
suffix 每列時間對應(yīng)的單位 Suffix.normal()
pickerStyle 詳見樣式 DefaultPickerStyle()
onChanged 選擇器發(fā)生變動 return (PDuration data) null
onConfirm 選擇器提交 return (PDuration data) null

參數(shù)說明

  • PDuration()

selectDate围俘,minDate砸讳,maxDate 和返回的數(shù)據(jù)類型 都是PDuration()

    // 可以自定義設(shè)置年月日時分秒
    PDuration(year: 2020, month: 1, day: 4, hour: 12, minute: 40, second: 36);
    // 設(shè)置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需要傳入年界牡,不然無法計(jì)算簿寂,如果沒有,會默認(rèn)當(dāng)前年
  • 當(dāng)只有單列數(shù)據(jù)宿亡,min|max限制不產(chǎn)生關(guān)聯(lián) 只針對單列item限制常遂,比如 maxDate: day=3, minDate: day=10, 那么day只顯示3-10之間
  • 如果minDate:year: 2020, month: 2, day: 10, 只顯示2020年2月10日之后的
  • minDate|maxDate 的YMD和HMS 沒有關(guān)聯(lián)! 沒有關(guān)聯(lián)挽荠!比如設(shè)置maxDate:year: 2020, month: 2, day: 10, hour:8克胳,不是2020年2月10日8時之后的時間

樣式

內(nèi)置樣式

style_picker_page.dart 請戳我查看demo代碼
default_style.dart 源碼

  • 以下4種樣式是使用 PickerStyle 類進(jìn)行封裝的。
  • 都內(nèi)置了夜間模式圈匆,如 NoTitleStyle.dark()
  • 除了NoTitleStyle, 其它的樣式可以傳入
    • haveRadius: 是否圓角
    • title: 標(biāo)題
    • color: 確定按鈕顏色
s1-1.png
s1-2.png
默認(rèn)樣式:DefaultPickerStyle() 默認(rèn)樣式(暗色):DefaultPickerStyle.dark()
s2-1.png
s2-2.png
無標(biāo)題樣式:NoTitleStyle() 無標(biāo)題樣式(暗色):NoTitleStyle.dark()
s3-1.png
s3-2.png
關(guān)閉按鈕樣式:ClosePickerStyle() 關(guān)閉按鈕樣式(暗色):ClosePickerStyle.dark()
s4-1.png
s4-2.png
圓角按鈕樣式:RaisedPickerStyle() 圓角按鈕樣式(暗色):RaisedPickerStyle.dark()

自定義樣式

style_picker_page.dart 請戳我查看demo代碼
picker_style.dart 樣式基類

style_mark.png
/// [showTitleBar] 是否顯示頭部(選擇器以上的控件) 默認(rèn):true
/// [menu] 頭部和選擇器之間的菜單widget漠另,默認(rèn)null 不顯示
/// [title] 頭部 中間的標(biāo)題  默認(rèn)SizedBox() 不顯示
/// [pickerHeight] 選擇器下面 picker 的整體高度  固定高度:220.0
/// [pickerTitleHeight]  選擇器上面 title 確認(rèn)、取消的整體高度  固定高度:44.0
/// [pickerItemHeight]  選擇器每個被選中item的高度:40.0
/// [menuHeight]  頭部和選擇器之間的菜單高度  固定高度:36.0
/// [cancelButton]  頭部的取消按鈕
/// [commitButton]  頭部的確認(rèn)按鈕
/// [textColor]  選擇器的文字顏色 默認(rèn)黑色
/// [backgroundColor]  選擇器的背景顏色 默認(rèn)白色
/// [headDecoration] 頭部Container 的Decoration   默認(rèn):BoxDecoration(color: Colors.white)

class PickerStyle {}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臭脓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腹忽,更是在濱河造成了極大的恐慌来累,老刑警劉巖砚作,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘹锁,居然都是意外死亡葫录,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門领猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來米同,“玉大人,你說我怎么就攤上這事摔竿∶媪福” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵继低,是天一觀的道長熬苍。 經(jīng)常有香客問我,道長袁翁,這世上最難降的妖魔是什么柴底? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮粱胜,結(jié)果婚禮上柄驻,老公的妹妹穿的比我還像新娘。我一直安慰自己焙压,他們只是感情好鸿脓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冗恨,像睡著了一般答憔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掀抹,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天虐拓,我揣著相機(jī)與錄音,去河邊找鬼傲武。 笑死蓉驹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揪利。 我是一名探鬼主播态兴,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疟位!你這毒婦竟也來了瞻润?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绍撞,沒想到半個月后正勒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傻铣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年章贞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片非洲。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸭限,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出两踏,到底是詐尸還是另有隱情败京,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布缆瓣,位于F島的核電站喧枷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弓坞。R本人自食惡果不足惜隧甚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渡冻。 院中可真熱鬧戚扳,春花似錦、人聲如沸族吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽超歌。三九已至砍艾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巍举,已是汗流浹背脆荷。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懊悯,地道東北人蜓谋。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像炭分,于是被迫代替她去往敵國和親桃焕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容