flutter - 如何在 Flutter Tabs 中添加圆点作为指示器?

标签 flutter dart flutter-layout

我们希望在 Flutter 中生成以下布局作为滚动选项卡: enter image description here

我尝试使用 TabBar 的 indicator 属性将指示器自定义为绿点。 indicator 属性采用一个 Decoration 继承的 Widget,它可能具有 BoxDecorationShapeDecorationUnderlineTabDecoration > 作为选项。 enter image description here

BoxDecorationShapeDecoration 都围绕选项卡内容,因此很难在选项卡下方添加圆圈。 UnderlineTabDecoration 不提供任何方法来圆化边缘和自定义宽度。

我能想到的最好的办法是:

TabBar(
          controller: _controller,
          indicatorSize: TabBarIndicatorSize.tab,
          indicator: UnderlineTabIndicator(
          borderSide: BorderSide(width: 5.0, ),
          insets: EdgeInsets.symmetric(horizontal:36.0)
        ),

          isScrollable: true,
          tabs: <Widget>[
            Tab(text: 'Week 1',),
            Tab(text: 'Week 2',),
            Tab(text: 'Week 3',),
            Tab(text: 'Week 4',),
            Tab(text: 'Week 5',),
            Tab(text: 'Week 6',),
            Tab(text: 'Week 7',),
            Tab(text: 'Week 8',),

          ],
        ),

结果如下: enter image description here

如何在 Flutter TabBar 中添加圆点作为指示器?

最佳答案

作为一个选项

这里是一个如何使用它的示例,您可以将 CircleTabIndicator 引入到您的项目中并根据需要进行修改

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Title')),
        body: DefaultTabController(
          length: 3,
          child: TabBar(
            indicatorSize: TabBarIndicatorSize.tab,
            indicator: CircleTabIndicator(color: Colors.green, radius: 4),
            isScrollable: true,
            labelColor: Colors.black,
            tabs: <Widget>[
              Tab(text: 'Week 1'),
              Tab(text: 'Week 2'),
              Tab(text: 'Week 3'),
            ],
          ),
        ),
      ),
    );
  }
}

class CircleTabIndicator extends Decoration {
  final BoxPainter _painter;

  CircleTabIndicator({@required Color color, @required double radius}) : _painter = _CirclePainter(color, radius);

  @override
  BoxPainter createBoxPainter([onChanged]) => _painter;
}

class _CirclePainter extends BoxPainter {
  final Paint _paint;
  final double radius;

  _CirclePainter(Color color, this.radius)
      : _paint = Paint()
          ..color = color
          ..isAntiAlias = true;

  @override
  void paint(Canvas canvas, Offset offset, ImageConfiguration cfg) {
    final Offset circleOffset = offset + Offset(cfg.size.width / 2, cfg.size.height - radius);
    canvas.drawCircle(circleOffset, radius, _paint);
  }
}

enter image description here

关于flutter - 如何在 Flutter Tabs 中添加圆点作为指示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57889326/

相关文章:

scroll - 如何在Flutter中滚动或跳转到PageView.builder或PageController的位置?

dart - Dart 中的 Math.round() 在哪里?

dart - Flutter - 为什么 slider 不会在 AlertDialog 中更新?

flutter - 不确定数量的 child 的堆栈对齐

firebase - Flutter:未捕获的 ReferenceError:firebase 未定义

flutter - 如何防止键盘向上移动堆栈中的其他小部件? ( flutter )

Flutter:如何在 ListView.builder 中显示来自 ListView.builder 的数组数据?

flutter - Flutter location.altitude返回0.0

Flutter spaceBetween 在 Card 小部件内的 Column 中不起作用

flutter :- Custom showDialog with background Color