How to give a “Dashed Border” in flutter?

前端 未结 5 1965
名媛妹妹
名媛妹妹 2021-01-01 18:00

I try to give dashed border in flutter but there is no option for dashed border in flutter. so any another way to create dashed border in futter.

  new Conta         


        
相关标签:
5条回答
  • 2021-01-01 18:43

    Image

    Use this component:

    import 'dart:math';
    
    import 'package:flutter/material.dart';
    
    class CircularBorder extends StatelessWidget {
    
      final Color color;
      final double size;
      final double width;
      final Widget icon;
    
      const CircularBorder({Key key, this.color = Colors.blue, this.size = 70, this.width = 7.0, this.icon}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          height: size,
          width: size,
          alignment: Alignment.center,
          child: Stack(
            alignment: Alignment.center,
            children: <Widget>[
              icon == null ? Container() : icon,
              CustomPaint(
                size: Size(size, size),
                foregroundPainter: new MyPainter(
                    completeColor: color,
                    width: width),
              ),
            ],
          ),
        );
      }
    }
    
    class MyPainter extends CustomPainter {
      Color lineColor =  Colors.transparent;
      Color completeColor;
      double width;
      MyPainter(
          { this.completeColor, this.width});
      @override
      void paint(Canvas canvas, Size size) {
        Paint complete = new Paint()
          ..color = completeColor
          ..strokeCap = StrokeCap.round
          ..style = PaintingStyle.stroke
          ..strokeWidth = width;
    
        Offset center = new Offset(size.width / 2, size.height / 2);
        double radius = min(size.width / 2, size.height / 2);
        var percent = (size.width *0.001) / 2;
    
        double arcAngle = 2 * pi * percent;
        print("$radius - radius");
        print("$arcAngle - arcAngle");
        print("${radius / arcAngle} - divider");
    
        for (var i = 0; i < 8; i++) {
          var init = (-pi / 2)*(i/2);
    
          canvas.drawArc(new Rect.fromCircle(center: center, radius: radius),
              init, arcAngle, false, complete);
        }
    
    
      }
    
      @override
      bool shouldRepaint(CustomPainter oldDelegate) {
        return true;
      }
    }
    

    Using:

    CircularBorder(
              width: 6,
              size: 55,
              color: Colors.grey,
              icon: Icon(Icons.access_alarm, color: Colors.grey),
            ),
    
    0 讨论(0)
  • 2021-01-01 18:51

    For rounded corners using this, you can use

        CornerRadius = 10.0;
    
        return DottedBorder(
          color: Colors.black,
          strokeWidth: 3,
          radius: Radius.circular(CardRadius),
          dashPattern: [10, 5],
          customPath: (size) {
            return Path()
              ..moveTo(CardRadius, 0)
              ..lineTo(size.width - CardRadius, 0)
              ..arcToPoint(Offset(size.width, CardRadius), radius: Radius.circular(CardRadius))
              ..lineTo(size.width, size.height - CardRadius)
              ..arcToPoint(Offset(size.width - CardRadius, size.height), radius: Radius.circular(CardRadius))
              ..lineTo(CardRadius, size.height)
              ..arcToPoint(Offset(0, size.height - CardRadius), radius: Radius.circular(CardRadius))
              ..lineTo(0, CardRadius)
              ..arcToPoint(Offset(CardRadius, 0), radius: Radius.circular(CardRadius));
          },
          child: Container(...)
        }
    
    

    This is what it looks like

    0 讨论(0)
  • 2021-01-01 18:53

    You can use dashPattern, an attribute which allows you to specify the Dash Sequence by passing in an Array of Doubles.

    DottedBorder(
        dashPattern: [6, 3, 2, 3], 
        child: ...
    );
    

    This code gives a dashed sequence of width 6, space 3, width 2, space 3,.... and this continues.

    To get a Dashed line across the screen, use

    DottedBorder(
      color: Color(0xFFE9EBF5),
      strokeWidth: 1,
      radius: Radius.circular(10),
      dashPattern: [5, 5],
      customPath: (size) {
        return Path()
          ..moveTo(0, 10)
          ..lineTo(size.width, 10);
      },
      child: Container(),
    ),
    
    0 讨论(0)
  • 2021-01-01 18:53

    I am using dotted_border plugin for this-

    import 'package:flutter/material.dart';
    
    import 'package:dotted_border/dotted_border.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
              appBar: AppBar(
                title: Text('Dotted Border'),
              ),
              body: SafeArea(
                child: Center(
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      crossAxisAlignment: CrossAxisAlignment.center,
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        container1,
                        Spacer(),
                        container2,
                        Spacer(),
                        container3,
                        Spacer(),
                        container4,
                      ],
                    ),
                  ),
                ),
              )),
        );
      }
    
      Widget get container1 {
        return DottedBorder(
          padding: EdgeInsets.all(4),
          dashPattern: [9, 5],
          child: Container(
            height: 110,
            width: double.maxFinite,
            decoration: BoxDecoration(
              color: Color(0xff994444),
            ),
          ),
        );
      }
    
      Widget get container2 {
        return DottedBorder(
          padding: EdgeInsets.all(8),
          dashPattern: [6],
          borderType: BorderType.Circle,
          child: Container(
            height: 210,
            width: double.maxFinite,
            decoration: ShapeDecoration(
              shape: CircleBorder(),
              color: Color(0xff444499),
            ),
          ),
        );
      }
    
      Widget get container3 {
        return DottedBorder(
          padding: EdgeInsets.all(4),
          borderType: BorderType.RRect,
          radius: Radius.circular(20),
          child: Container(
            height: 120,
            width: double.maxFinite,
            decoration: ShapeDecoration(
              shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
              color: Color(0xff994444),
            ),
          ),
        );
      }
    
      Widget get container4 {
        return DottedBorder(
          borderType: BorderType.Oval,
          dashPattern: [8,4,2,4],
          child: Container(
            height: 180,
            width: double.maxFinite,
            decoration: ShapeDecoration(
              shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
              color: Color(0x22888888),
            ),
          ),
        );
      }
    }
    
    0 讨论(0)
  • 2021-01-01 18:57

    As long as it is a Rectangular dashed border you want, you can now use dotted_border package which I have uploaded to Pub.

    Usage

    DottedBorder(
      color: Colors.black,
      gap: 3,
      strokeWidth: 1,
      child: FlutterLogo(size: 148),
    )
    

    0 讨论(0)
提交回复
热议问题