Flutter 基于ChoiceChip的標(biāo)簽選擇控件

1.ChoiceChip

ChoiceChip 選擇控件蛀柴,可以實(shí)現(xiàn)單選效果

先看對(duì)應(yīng)的屬性

 const ChoiceChip({
    Key key,
    this.avatar, //左側(cè)Widget 一般小圖標(biāo)
    @required this.label, //標(biāo)簽文字
    this.labelStyle, //標(biāo)簽文字的樣式
    this.labelPadding, 
    this.onSelected, 
    this.pressElevation, 
    @required this.selected, //是否選中
    this.selectedColor, //選擇的顏色
    this.disabledColor, //不可用的顏色
    this.tooltip, 
    this.shape, //shape 默認(rèn)是兩端半圓形
    this.clipBehavior = Clip.none,
    this.backgroundColor, //背景色
    this.padding, 
     //設(shè)置為MaterialTapTargetSize.shrinkWrap時(shí)
     //睹酌,clip距頂部距離為0伞租;設(shè)置為MaterialTapTarget
     //Size.padded時(shí)距頂部有一個(gè)距離
    this.materialTapTargetSize,
    this.elevation,
    this.shadowColor,//陰影背景色
    this.selectedShadowColor,//選中的陰影背景色
    this.avatarBorder = const CircleBorder(),
  })

默認(rèn)的情況下熏兄,ChoiceChip 選擇主要是修改背景色以及對(duì)應(yīng)的文字亡容,

2.封裝代碼

MultiNormalSelectChip封裝ChoiceChip完成標(biāo)簽選擇

//提供tag基本類
abstract class BaseSelectEntity{
  String getTag();
}


class MultiNormalSelectChip<T extends BaseSelectEntity> extends StatefulWidget {
  /// 標(biāo)簽的list
  final List<T> dataList;

  /// 標(biāo)簽的list
  final List<T> selectList;

  ///選擇回調(diào)事件
  final Function(List<T>) onSelectionChanged;

  MultiNormalSelectChip(this.dataList, {this.selectList, this.onSelectionChanged});

  @override
  _MultiNormalSelectChipState createState() => _MultiNormalSelectChipState(selectList);
}

class _MultiNormalSelectChipState<T extends BaseSelectEntity>
    extends State<MultiNormalSelectChip> {
  List<T> selectList;

  _MultiNormalSelectChipState(this.selectList);

  _buildChoiceList() {
    List<Widget> choices = List();
    widget.dataList.forEach((item) {
      choices.add(Container(
        height: 31,
        padding: EdgeInsets.all(4),
        child: ChoiceChip(
          label: Text(
            item.getTag(),
            style: TextStyle(fontSize: 14),
          ),
          selected: selectList.contains(item),
          materialTapTargetSize: MaterialTapTargetSize.padded,
          labelPadding: EdgeInsets.only(bottom: 9),
          padding: EdgeInsets.only(left: 12, right: 12, bottom: 9),
          selectedColor: Colors.white,
          backgroundColor: Colors.blue,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(12),
            side: BorderSide(color: Colors.black, width: 0.5),
          ),
          onSelected: (selected) {
            setState(() {
              selectList.contains(item)
                  ? selectList.remove(item)
                  : selectList.add(item);
              widget.onSelectionChanged(selectList);
            });
          },
        ),
      ));
    });

    return choices;
  }

  @override
  Widget build(BuildContext context) {
    return Wrap(
      alignment: WrapAlignment.end,
      children: _buildChoiceList(),
    );
  }
}


定義個(gè)基本實(shí)體類嗤疯,BaseSelectEntity,提供getTag方法返回標(biāo)簽的label,之后根據(jù)傳進(jìn)來(lái)的list,遍歷生成對(duì)應(yīng)的choiceChip即可完成標(biāo)簽選擇。然后通過(guò)回調(diào)函數(shù)onSelected 設(shè)置對(duì)應(yīng)的選中的item 存入selectList中
其效果如下:

image

3.修改原有的ChoiceChip

然而公司UI給的圖確實(shí)這樣的闺兢,這種情況下茂缚,就需要修改ChoiceChip源碼戏罢,增加selectShape屬性

BorderChoiceChip(
          label: Text(
            item.getTag(),
            style: TextStyle(fontSize: 14),
          ),
          selected: selectList.contains(item),
          materialTapTargetSize: MaterialTapTargetSize.padded,
          labelPadding: EdgeInsets.only(bottom: 9),
          padding: EdgeInsets.only(left: 12, right: 12, bottom: 9),
          selectedColor: Colors.white,
          backgroundColor: Colors.white,
          //修改邊框樣式
          selectShape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(12),
            side: BorderSide(color: Colors.blue, width: 0.5),
          ),
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(12),
            side: BorderSide(color: Colors.black, width: 0.5),
          ),
          onSelected: (selected) {
            setState(() {
              selectList.contains(item)
                  ? selectList.remove(item)
                  : selectList.add(item);
              widget.onSelectionChanged(selectList);
            });
          },

這樣就可以達(dá)到相對(duì)應(yīng)的要求,效果如下


image

具體的代碼,可以查看 demo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脚囊,一起剝皮案震驚了整個(gè)濱河市龟糕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悔耘,老刑警劉巖讲岁,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衬以,居然都是意外死亡缓艳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門看峻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阶淘,“玉大人,你說(shuō)我怎么就攤上這事互妓∠希” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵冯勉,是天一觀的道長(zhǎng)澈蚌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)灼狰,這世上最難降的妖魔是什么宛瞄? 我笑而不...
    開(kāi)封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮伏嗜,結(jié)果婚禮上坛悉,老公的妹妹穿的比我還像新娘。我一直安慰自己承绸,他們只是感情好裸影,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著军熏,像睡著了一般轩猩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荡澎,一...
    開(kāi)封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天均践,我揣著相機(jī)與錄音,去河邊找鬼摩幔。 笑死彤委,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的或衡。 我是一名探鬼主播焦影,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼车遂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了斯辰?” 一聲冷哼從身側(cè)響起舶担,我...
    開(kāi)封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彬呻,沒(méi)想到半個(gè)月后衣陶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸氮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年剪况,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湖苞。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拯欧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出财骨,到底是詐尸還是另有隱情,我是刑警寧澤藏姐,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布隆箩,位于F島的核電站,受9級(jí)特大地震影響羔杨,放射性物質(zhì)發(fā)生泄漏捌臊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一兜材、第九天 我趴在偏房一處隱蔽的房頂上張望理澎。 院中可真熱鬧,春花似錦曙寡、人聲如沸糠爬。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)执隧。三九已至,卻和暖如春户侥,著一層夾襖步出監(jiān)牢的瞬間镀琉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工蕊唐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屋摔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓替梨,卻偏偏與公主長(zhǎng)得像钓试,于是被迫代替她去往敵國(guó)和親装黑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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