How to add line dash in Flutter

前端 未结 10 1003
清歌不尽
清歌不尽 2021-02-07 02:54

How to make a line dash in Flutter like this?

相关标签:
10条回答
  • 2021-02-07 03:03

    I have written flutter_dash library for drawing that dash. Just one line and you should have a dash :D

    Dash(length: 200, dashColor: Colors.red)
    

    Give it a try!

    0 讨论(0)
  • 2021-02-07 03:08
    class DashedLinePainter extends CustomPainter {
      @override
      void paint(Canvas canvas, Size size) {
        double dashWidth = 9, dashSpace = 5, startX = 0;
        final paint = Paint()
          ..color = Colors.grey
          ..strokeWidth = 1;
        while (startX < size.width) {
          canvas.drawLine(Offset(startX, 0), Offset(startX + dashWidth, 0), paint);
          startX += dashWidth + dashSpace;
        }
      }
    
      @override
      bool shouldRepaint(CustomPainter oldDelegate) => false;
    }
    
    0 讨论(0)
  • 2021-02-07 03:09

    As a workaround, in your case, you can do something like this

    class MySeparator extends StatelessWidget {
      final double height;
      final Color color;
    
      const MySeparator({this.height = 1, this.color = Colors.black});
    
      @override
      Widget build(BuildContext context) {
        return LayoutBuilder(
          builder: (BuildContext context, BoxConstraints constraints) {
            final boxWidth = constraints.constrainWidth();
            final dashWidth = 10.0;
            final dashHeight = height;
            final dashCount = (boxWidth / (2 * dashWidth)).floor();
            return Flex(
              children: List.generate(dashCount, (_) {
                return SizedBox(
                  width: dashWidth,
                  height: dashHeight,
                  child: DecoratedBox(
                    decoration: BoxDecoration(color: color),
                  ),
                );
              }),
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              direction: Axis.horizontal,
            );
          },
        );
      }
    }
    

    and use it const MySeparator()

    class App extends StatelessWidget {
      const App();
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Material(
            child: Container(
              color: Colors.blue,
              child: Center(
                child: Container(
                  height: 600, width: 350,
                  decoration: BoxDecoration(
                    color: Colors.white,
                    borderRadius: BorderRadius.all(Radius.circular(16.0)),
                  ),
                  child: Flex(
                    direction: Axis.vertical,
                    children: [
                      Expanded(child: Container()),
                      const MySeparator(color: Colors.grey),
                      Container(height: 200),
                    ],
                  ),
                ),
              ),
            ),
          ),
        );
      }
    }
    

    0 讨论(0)
  • 2021-02-07 03:11

    CustomPainter can help here as well. In this example is a vertical dash line but could be changed easily.

    class LineDashedPainter extends CustomPainter {
      @override
      void paint(Canvas canvas, Size size) {
        var paint = Paint()..strokeWidth = 2;
        var max = 35;
        var dashWidth = 5;
        var dashSpace = 5;
        double startY = 0;
        while (max >= 0) {
          canvas.drawLine(Offset(0, startY), Offset(0, startY + dashWidth), paint);
          final space = (dashSpace + dashWidth);
          startY += space;
          max -= space;
        }
      }
    
      @override
      bool shouldRepaint(CustomPainter oldDelegate) => false;
    }
    

    and that use CustomPaint Widget:

    CustomPaint(painter: LineDashedPainter())
    
    0 讨论(0)
  • 2021-02-07 03:11

    Try this,

    class DotDivider extends StatelessWidget {
      final double width;
      final double height;
      final double gap;
      final Color color;
      final double lineHeight;
    
      const DotDivider(
          {this.height = 1.0,
          this.color = Colors.black,
          this.width = 2.0,
          this.gap = 2.0,
          this.lineHeight = 10.0});
    
      @override
      Widget build(BuildContext context) {
        return LayoutBuilder(
          builder: (BuildContext context, BoxConstraints constraints) {
            final boxWidth = constraints.constrainWidth();
            final dashWidth = width;
            final dashHeight = height;
            final dashCount = (boxWidth / dashWidth).floor();
            return Container(
              height: (lineHeight * 2) + height,
              child: ListView.builder(
                physics: NeverScrollableScrollPhysics(),
                scrollDirection: Axis.horizontal,
                itemCount: dashCount,
                itemBuilder: (BuildContext context, int index) => Center(
                  child: Container(
                    width: dashWidth,
                    height: dashHeight,
                    margin:
                        EdgeInsets.symmetric(vertical: lineHeight, horizontal: gap),
                    decoration: BoxDecoration(color: color),
                  ),
                ),
              ),
            );
          },
        );
      }
    }
    
    0 讨论(0)
  • 2021-02-07 03:16
    // garis putus putus
    Row(
    children: List.generate(150~/10, (index) => Expanded(
     child: Container(
      color: index%2==0?Colors.transparent
      :Colors.grey,
      height: 2,
     ),
     )),
    ),
    
    0 讨论(0)
提交回复
热议问题