太菜的Widget

效果.gif

1、自動(dòng)適應(yīng)寬度未做,文本都沒有難度喘批,但下面的指示器的移動(dòng)要獲取text的寬度有點(diǎn)麻煩昭灵,所以就偷懶個(gè)懶,暫時(shí)沒有做篮绿;
2硫朦、標(biāo)題用的row文黎,不能滿足多個(gè)(超出屏幕寬度)title的情況七冲,可以換成ListView痛倚,請(qǐng)問指示器 移動(dòng)的問題,怎么處理呢澜躺?
如果您有好的方法蝉稳,歡迎推薦

源碼

import 'package:flutter/material.dart';

class SpecialSubTitleWidget extends StatefulWidget {
  final List<String> titleList;
  //正常item的點(diǎn)擊回調(diào)
  final Function(dynamic) titleClickActionBlock;
  const SpecialSubTitleWidget({
    Key? key,
    required this.titleList,
    required this.titleClickActionBlock,
    // this.rowNumber = 4,
    // this.maxShowItemNumber = 0,
    // this.itemAspectRatio = 1.0,
    // this.mainAxisSpacing = 10.0,
    // this.crossAxisSpacing = 10.0,
    // this.itemTextFontSize = 14.0,
    // this.showMoreButton = false,
    // this.isCanScrollable = true,
    // this.moreButtonClickActionBlock,
    // this.backgroundColor,
    // this.itemBackgroundColor,
  }) : super(key: key);

  @override
  State<SpecialSubTitleWidget> createState() => _SpecialSubTitleWidgetState();
}

class _SpecialSubTitleWidgetState extends State<SpecialSubTitleWidget> {
  late List<SpecialTextButton> titleBtnList;
  late List<bool> buttonStates;
  int currentSelectIndex = 0;
  double indicatorLeft = 0;
  double itemW = 45;
  @override
  void initState() {
    titleBtnList = [];
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return pageItemBar();
  }

  Widget pageItemBar() {
    return Container(
      height: 50,
      color: Colors.white,
      padding: const EdgeInsets.symmetric(horizontal: 20),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Expanded(child: Row(children: creatTitleButtons(widget.titleList))),
          SizedBox(
            height: 3,
            width: double.infinity,
            child: Stack(
              children: [
                Positioned(
                  left: 0,
                  right: 0,
                  bottom: 0,
                  child: Container(
                    height: 1,
                    color: Colors.red,
                  ),
                ),
                Positioned(
                  left: indicatorLeft,
                    child: Container(
                        height: 3,
                        width: itemW,
                        decoration: const BoxDecoration(
                            color: Colors.blue,
                            borderRadius: BorderRadius.only(
                                topLeft: Radius.circular(4),
                                topRight: Radius.circular(4))))),
              ],
            ),
          )
        ],
      ),
    );
  }

//方法
  creatTitleButtons(List titles) {
    if (titles.isEmpty) {
      return;
    }
    //默認(rèn)所以按鈕不選中
    buttonStates = List.generate(titles.length, (index) => false);
    //默認(rèn)選中第一個(gè)
    buttonStates[currentSelectIndex] = true;

    titleBtnList = titles.map((e) {
      int index = titles.indexOf(e);
      return SpecialTextButton(
          titleStr: e,
          selected: buttonStates[index],
          index: index,
          onPressed: (newIndex) {
            widget.titleClickActionBlock(newIndex);
            setState(() {
              buttonStates[currentSelectIndex] = false;
              buttonStates[newIndex] = true;
              currentSelectIndex = newIndex;
              indicatorLeft = newIndex * itemW;
            });
          });
    }).toList();
    return titleBtnList;
  }
}

class SpecialTextButton extends StatefulWidget {
  final String titleStr;
  final Function(int) onPressed;
  final bool selected;
  final int index;
  final double fontSizeSele;
  final double fontSizeNormal;
  final Color colorSele;
  final Color colorNormal;
  //正常item的點(diǎn)擊回調(diào)

  const SpecialTextButton({
    Key? key,
    required this.titleStr,
    required this.onPressed,
    required this.selected,
    required this.index,
    this.fontSizeSele = 18,
    this.fontSizeNormal = 16,
    this.colorNormal = Colors.black,
    this.colorSele = Colors.blue,
  }) : super(key: key);

  @override
  State<SpecialTextButton> createState() => _SpecialTextButtonState();
}

class _SpecialTextButtonState extends State<SpecialTextButton> {
  late TextStyle normalStyle;
  late TextStyle selectStyle;

  @override
  void initState() {
    super.initState();
    normalStyle =
        TextStyle(fontSize: widget.fontSizeNormal, color: widget.colorNormal);//,decoration: TextDecoration.none
    selectStyle =
        TextStyle(fontSize: widget.fontSizeSele, color: widget.colorSele);//,decoration: TextDecoration.none
  }

  @override
  Widget build(BuildContext context) {
    return Material(child: GestureDetector(
        onTap: () => widget.onPressed(widget.index),
        child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 5),
            child: Text(widget.titleStr,
                style: widget.selected ? selectStyle : normalStyle))));
  }
}

使用方法

child: SpecialSubTitleWidget(titleList: const ["應(yīng)用","本地","按鈕3"], titleClickActionBlock: (index){
              print("------------click: $index --------");
          }),
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掘鄙,隨后出現(xiàn)的幾起案子耘戚,更是在濱河造成了極大的恐慌,老刑警劉巖操漠,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件收津,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颅夺,警方通過查閱死者的電腦和手機(jī)朋截,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吧黄,“玉大人,你說我怎么就攤上這事唆姐∞挚” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵奉芦,是天一觀的道長(zhǎng)赵抢。 經(jīng)常有香客問我,道長(zhǎng)声功,這世上最難降的妖魔是什么烦却? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮先巴,結(jié)果婚禮上其爵,老公的妹妹穿的比我還像新娘。我一直安慰自己伸蚯,他們只是感情好摩渺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剂邮,像睡著了一般摇幻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天绰姻,我揣著相機(jī)與錄音枉侧,去河邊找鬼。 笑死狂芋,一個(gè)胖子當(dāng)著我的面吹牛棵逊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播银酗,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼辆影,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了黍特?” 一聲冷哼從身側(cè)響起蛙讥,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灭衷,沒想到半個(gè)月后次慢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翔曲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年迫像,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳遍。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闻妓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掠械,到底是詐尸還是另有隱情由缆,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布猾蒂,位于F島的核電站均唉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏肚菠。R本人自食惡果不足惜舔箭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚊逢。 院中可真熱鬧层扶,春花似錦、人聲如沸时捌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奢讨。三九已至稚叹,卻和暖如春焰薄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扒袖。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工塞茅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人季率。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓野瘦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親飒泻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鞭光,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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