flutter創(chuàng)建省市區(qū)三級聯(lián)動

話不多說先上效果圖法竞。
IMG_1179.PNG

這是一個從底部彈起的BottomSheet杈女,選擇完成確定后會回調(diào)所選擇的內(nèi)容秸妥。

下面直接上封裝好的底部彈出的省市區(qū)視圖類
import 'package:flutter/material.dart';
import 'package:my_flutter/areajsonlist.dart';
class ShaiXuanSelectWidget extends StatefulWidget {
  final List PinpaiListData;
  ShaiXuanSelectWidget(
      {
         @required this.PinpaiListData,
    });
  @override
  ShaiXuanSelectWidgetState createState() => ShaiXuanSelectWidgetState();
}

class ShaiXuanSelectWidgetState extends State<ShaiXuanSelectWidget> {
  //品牌字典組
  List _pinpaiGroup = [];
  // 當前選中的品牌
  int _nowClickPinpai;

  // 分類選擇組
  List _typeGroup = [];
  int _nowClickFenlei;
  // 系列選擇組
  List _xilieGroup = [];
  int _nowClickXilie;
  // 當前選擇系列的數(shù)據(jù)
  // List _nowChooseXilieGroup = [];
String _nowSelectedXilieSte = "";
  bool _isFirst = true;

  @override
  void initState() {
    super.initState();
    if (_isFirst) {
      initData();
      _isFirst = false;
    }
  }
  @override
  Widget build(BuildContext context) {

   return StatefulBuilder(
      builder: (BuildContext context, StateSetter modalSetState) {
        return Container(
          child: Column(
            children: <Widget>[
              Expanded(
                child: buildDeviceContainer(modalSetState),
              ),
              Expanded(
                flex: 0,
                child: buildBottomButton(modalSetState),
              ),
            ],
          ),
        );
      },
    );
  }

  // 初始化數(shù)據(jù)
  void initData() {
    _pinpaiGroup = [];
    // whilePinpai(widget.PinpaiListData);
    whileBig(jsonlistclass.jsonlist);
    setState(() {});
  }
  void whileBig(data) {
    for (int i = 0; i < data.length; i++) {
      if (null != data[i]) {
        _pinpaiGroup
            .add({'name': data[i]["name"], 'city': data[i]["city"]});
      }
    }
  }
  // 格式化品牌組
  void whilePinpai(data) {
    for (int i = 0; i < data.length; i++) {
      if (null != data[i]) {
        _pinpaiGroup
            .add({'name': data[i].name, 'value': data[i].cid});
      }
    }
  }

  // 選擇品牌
  buildDeviceContainer(StateSetter modalSetState) {
    return Row(
      children: <Widget>[
    Expanded(
    child: Column(
        children: <Widget>[
          Container(
            height: 20,
            child: Text('品牌',style: TextStyle(
              fontSize: 16,
            ),),
          ),
          Expanded(
            child: selectPinpaiItem(modalSetState),
          ),
        ])),

        Expanded(
          child: Column(
            children: <Widget>[
              Container(
                height: 20,
                child: Text('分類', style: TextStyle(
                  fontSize: 16,
                ),),
              ),
              Expanded(
                child: selectTypeItem(modalSetState),
              ),
            ],
          ),
        ),
        Expanded(
          child: Column(
            children: <Widget>[
              Container(
                      height: 20,
                      child: Text('系列',style: TextStyle(
                        fontSize: 16,
                      ),),
                    ),
              Expanded(
                child: selectXILieItem(modalSetState),
              ),
            ],
          ),
        ),
      ],
    );
  }

  // 底部操作按鈕
  buildBottomButton(StateSetter modalSetState) {
    return Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          RaisedButton(
            child: Text('取消'),
            onPressed: () {
              modalSetState(() {
                _nowClickPinpai = null;
                _nowClickFenlei=null;
                _nowClickFenlei=null;
                _typeGroup = [];
                _xilieGroup = [];
                // _nowChooseXilieGroup = [];
                _nowSelectedXilieSte = "";
              });
            },
          ),
          RaisedButton(
            padding: EdgeInsets.all(0),
            color: Color.fromRGBO(
                253, 117, 80, 1),
            child: Text('確定',  textAlign: TextAlign.center,
              style: TextStyle(
                color: Colors.white,
                fontSize: 14,
              ),),
            onPressed: () {
              Navigator.pop(context, _nowSelectedXilieSte);
            },
          ),
        ],

    );
  }

  // 品牌列表
  selectPinpaiItem(StateSetter modalSetState) {
    return ListView.separated(
      itemBuilder: (BuildContext context, int index) {
        return Container(
          height: 40,
          child: GestureDetector(
            child: ListTile(
              title: Text(
                  _pinpaiGroup.length > 0 ? _pinpaiGroup[index]['name'] ?? ' ' : ' ',
                  maxLines: 1,
                  style: _nowClickPinpai == index
                      ? TextStyle(color:Color.fromRGBO(
                      253, 117, 80, 1), fontSize: 13,)
                      : TextStyle(fontSize: 13,color:Colors.black45)),
            ),
            onTap: () {
              if (_nowClickPinpai != index) {
              setState(() {
                _nowClickPinpai = index;
                whileType(_pinpaiGroup[index]);
              });
              }
            },
          ),
        );
      },
      separatorBuilder: (BuildContext context, int index) {
        return Divider(
          height: 0.0,
        );
      },
      itemCount: _pinpaiGroup.length,
    );

  }

  // 分類列表
  selectTypeItem(StateSetter modalSetState) {
    return ListView.separated(
      itemBuilder: (BuildContext context, int index) {
        return Container(
          height: 40,
          child: GestureDetector(
            child: ListTile(
              title: Text(
                  _typeGroup.length > 0 ? _typeGroup[index]['name'] ?? ' ' : ' ',
                  style: _nowClickFenlei==index
                      ? TextStyle(color: Color.fromRGBO(
                      253, 117, 80, 1), fontSize: 13,)
                      : TextStyle(fontSize: 13,color:Colors.black45)),
            ),
            onTap: () {
              if (_nowClickFenlei != index) {
                setState(() {
                  _nowClickFenlei = index;
                  whileXilie(_typeGroup[index]);
                });
              }
            },
          ),
        );
      },
      separatorBuilder: (BuildContext context, int index) {
        return Divider(
          height: 0.0,
        );
      },
      itemCount: _typeGroup.length,
    );
  }

  // 系列列表
  selectXILieItem(StateSetter modalSetState) {
    return ListView.separated(
      itemBuilder: (BuildContext context, int index) {
        return Container(
          height: 40,
          child: GestureDetector(
            child: ListTile(
              title: Text(
                _xilieGroup.length > 0 ? _xilieGroup[index]['name'] ?? ' ' : ' ',
                style: _nowClickXilie==index
                    ? TextStyle(color: Color.fromRGBO(
                    253, 117, 80, 1), fontSize: 13,)
                    : TextStyle(fontSize: 13,color:Colors.black45)),
              ),
            onTap: () {
              if (_nowClickXilie != index) {
                setState(() {
                  _nowClickXilie  = index;
                  _nowSelectedXilieSte =_xilieGroup[index]['name'];
                });
              }
            },
          ),
        );
      },
      separatorBuilder: (BuildContext context, int index) {
        return Divider(
          height: 0.0,
        );
      },
      itemCount: _xilieGroup.length,
    );
  }

// 獲取分類名稱
  whileType(dataMap) {
    _typeGroup=[];
    for (int i = 0; i < dataMap['city'].length; i++) {
      if (null != dataMap['city'][i]) {
          _typeGroup.add(
              {'name': dataMap['city'][i]['name'],'area': dataMap['city'][i]['area'], 'check': false});
      }
    }
  }

 // 獲取系列
  whileXilie(areaMap) {
    _xilieGroup=[];
    for (int i = 0; i < areaMap['area'].length; i++) {
      if (null != areaMap['area'][i]) {
        _xilieGroup.add(
            {'name': areaMap['area'][i], 'check': false});
      }
    }
  }
}
用法:在需要的地方,自由調(diào)用即可
  MakeShaiXuan(BuildContext context) {
    showModalBottomSheet(
      context: context,
        builder: (context) => Container(
          child:ShaiXuanSelectWidget(PinpaiListData: Global.GlobalPinPaiItemsArrY),
          height: 600,
        ),
    ).then((val) {
      print(val);
      Soutchstr = val;
       _pageNo = 1;
       List _recodemodelitems = [];
        this._recodemodelitems.clear();
       RequestRecodeData(true);
    });
  }
結(jié)語:最后附上省市區(qū)的json地址:https://blog.csdn.net/youshi520000/article/details/70808580/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霉囚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匕积,更是在濱河造成了極大的恐慌盈罐,老刑警劉巖榜跌,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盅粪,居然都是意外死亡钓葫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門湾揽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓤逼,“玉大人,你說我怎么就攤上這事库物“云欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵戚揭,是天一觀的道長诱告。 經(jīng)常有香客問我,道長民晒,這世上最難降的妖魔是什么精居? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮潜必,結(jié)果婚禮上靴姿,老公的妹妹穿的比我還像新娘。我一直安慰自己磁滚,他們只是感情好佛吓,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垂攘,像睡著了一般维雇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晒他,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天吱型,我揣著相機與錄音,去河邊找鬼陨仅。 笑死津滞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的灼伤。 我是一名探鬼主播触徐,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饺蔑!你這毒婦竟也來了锌介?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孔祸,沒想到半個月后隆敢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡崔慧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年拂蝎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惶室。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡温自,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皇钞,到底是詐尸還是另有隱情悼泌,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布夹界,位于F島的核電站馆里,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏可柿。R本人自食惡果不足惜鸠踪,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望复斥。 院中可真熱鬧营密,春花似錦、人聲如沸目锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侣集。三九已至键俱,卻和暖如春兰绣,著一層夾襖步出監(jiān)牢的瞬間世分,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工缀辩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留臭埋,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓臀玄,卻偏偏與公主長得像瓢阴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子健无,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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