Search code examples
flutterflutter-layout

How to add line dash in Flutter


How to make a line dash in Flutter like this?

Image


Solution

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

    class MySeparator extends StatelessWidget {
      const MySeparator({Key? key, this.height = 1, this.color = Colors.black})
          : super(key: key);
      final double height;
      final Color color;
    
      @override
      Widget build(BuildContext context) {
        return LayoutBuilder(
          builder: (BuildContext context, BoxConstraints constraints) {
            final boxWidth = constraints.constrainWidth();
            const 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({Key? key}) : super(key: key);
    
      @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),
                    ],
                  ),
                ),
              ),
            ),
          ),
        );
      }
    }
    

    demo