How can I customize the TabBar indicator width and height?

Viewed 67246

I'm using a TabBar widget and I'd like to customize the height and width of the indicator. I can't see any other property besides color I can modify.

enter image description here

11 Answers

You can use indicatorSize: TabBarIndicatorSize.label on the TabBar to make the indicator the same size as the label.

Or you could set the indicator directly, this is a Decoration which you can customize:

AppBar(
    bottom: TabBar(
        indicator: UnderlineTabIndicator(
          borderSide: BorderSide(width: 5.0),
          insets: EdgeInsets.symmetric(horizontal:16.0)
        ),
        tabs: [
          Tab(text: 'tab 1'),
          Tab(text: 'tab 2'),
          Tab(text: 'tab 3'),
        ],
     ),
);

For more customisation options check this post

In the same way as this answer https://stackoverflow.com/a/44273493/5938089, The best is to use containers, but I will only use one.

For a change, I will use a bottom bar

bottomNavigationBar: new Material(
    color: Colors.teal,
    child: new Container(
      height: 60.0,
      child: new TabBar(
        controller: controller,
        tabs: <Widget>[
            new Tab(icon: new Icon(Icons.access_alarm)),
            new Tab(icon: new Icon(Icons.account_balance)),
        ]
      ),
    )
  ),

Screen Shot

You can adjust the spacing between the tabs -> labelPadding: EdgeInsets.symmetric (horizontal: 5),

You can use property TabBar(indicatorWeight:detail Height).

appBar: new AppBar(
        title: Text("TabBar demo"),
        bottom: PreferredSize(
          preferredSize: Size.fromHeight(kToolbarHeight),
          child: Align(
            alignment: Alignment.centerLeft,
            child: new TabBar(
              controller: _tabController,
              indicator: UnderlineTabIndicator(
                borderSide: BorderSide(width: 3.0, color: Colors.red),
                insets: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10),
              ),
              indicatorSize: TabBarIndicatorSize.label,
              isScrollable: true,
              onTap: (index) {
                print(index);
                _currentIndex = index;
                setState(() {});
              },
              tabs: [
                new Container(
                  height: 50.0,
                  width: 80,
                  // color: Colors.red,
                  child: new Tab(text: '1'),
                ),
                new Container(
                  height: 50.0,
                  width: 80,
                  // color: Colors.red,
                  child: new Tab(text: '222'),
                ),
                new Container(
                  height: 50.0,
                  width: 80,
                  // color: Colors.red,
                  child: new Tab(text: '333333'),
                ),
              ],
            ),
          ),
        ),
      ),
      // body: ...
    );

Try to do this in the TabBar

                  indicatorWeight: 0,
                  indicator: UnderlineTabIndicator(
                    borderSide: BorderSide(
                      width: 0.1,
                      color: AppColor.themeColor,
                    ),

You can design the underline indicator with border-radius, and the length of the indicator according to the text container length.

child: TabBar(
    indicatoenter code herer: BoxDecoration(
        borderRadius: BorderRadius.circular(10),
        color: widgetBlueColor,
    ),
    indicatorPadding: const EdgeInsets.only(top: 33, bottom: 2),
    labelColor: widgetBlueColor,
    unselectedLabelColor: Colors.black87,
    labelPadding: const EdgeInsets.only(bottom: 16),
    indicatorSize: TabBarIndicatorSize.label,
    labelStyle: const TextStyle(fontWeight: FontWeight.w500),
    tabs: const [
        Tab(
            child: SizedBox(
                width: 60,
                child: Text(
                    "DETAILS",
                    textAlign: TextAlign.center,
                ),
            ),
        ),
        Tab(
            child: SizedBox(
                width: 85,
                child: Text(
                    "DOCUMENTS",
                    textAlign: TextAlign.center,
                ),
            )
        )
    ]
)

if you decrease default tab bar size use SizeBox().

                             SizedBox(
                                  height: 40,
                                  child: TabBar(
                                      isScrollable: true,
                                      indicatorSize: TabBarIndicatorSize.tab,
                                      labelColor: Colors.black,
                                      unselectedLabelColor: Colors.grey,
                                      labelStyle: TextStyle(
                                          fontSize: 15,
                                          fontWeight: FontWeight.w500),
                                      unselectedLabelStyle: TextStyle(
                                          fontSize: 14,
                                          fontWeight: FontWeight.w400),

                                      padding:
                                          EdgeInsets.symmetric(horizontal: 12),
                                      indicator: BoxDecoration(
                                          borderRadius: BorderRadius.circular(16),
                                          color: AppTheme().orange),
                                      tabs: getTab(),
                                      controller: _tabController),
                                ),

You can use the property toolbarHeight

AppBar(
toolbarHeight: 50.0,
)
Related