如何在Flutter中设置“虚线边框”?

24

我尝试在Flutter中创建虚线边框,但Flutter中没有虚线边框选项。所以是否有其他方法可以在Flutter中创建虚线边框。

  new Container(
          decoration: new BoxDecoration(
              border: Border(
                  left: BorderSide(color: Color(0XFFFF6D64), width: 2.0))),
          height: 20.0,
          margin: const EdgeInsets.only(left: 35.0),
          child: new Row(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              new DecoratedBox(
                decoration: new BoxDecoration(
                    border: Border(
                        left:
                            BorderSide(color: Color(0XFFFF6D64), width: 2.0,style: BorderStyle.))),

              )
            ],
          ),
        ),

请参见:https://github.com/flutter/flutter/issues/4858#issuecomment-387492774 - Günter Zöchbauer
请查看此答案 - Ajil O.
7个回答

25

只要你想要一个虚线矩形边框,现在你可以使用我上传到Pub的dotted_border包。

用法


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

输入图像描述


它支持圆角吗? - kageeker
@kageeker 是的,你需要设置 BorderType 和 BorderRadius 属性。 - Ajil O.
2
有没有办法使用这个插件只在某些边框上使用边框? - progNewbie

12

Image

使用这个组件:

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;
  }
}

使用:

CircularBorder(
          width: 6,
          size: 55,
          color: Colors.grey,
          icon: Icon(Icons.access_alarm, color: Colors.grey),
        ),

如果我只需要三个破折号,你能帮忙吗? - adamu_fura
请解释 var percent = (size.width *0.001) / 2; double arcAngle = 2 * pi * percent - Zar E Ahmer

9

使用 this 实现圆角,你可以使用

    CardRadius = 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(...)
    }

这是它的外观

enter image description here


你可以使用 "radius: Radius.circular(20), borderType: BorderType.RRect," 来创建圆角边框,而不是使用复杂的路径。 - maxmitz
@maxmitz,使用复杂路径,您可以在需要时禁用任何一侧的边框。 - Tanjim ahmed

2

您可以使用dashPattern属性,通过传递一个Double数组来指定虚线序列。

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

这段代码生成了一个宽度为6,间隔为3,宽度为2,间隔为3的虚线序列,并持续不断地生成。

要在屏幕上得到一条虚线,请使用以下代码:

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(),
),

2

我正在使用dotted_border插件实现这个功能-

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),
        ),
      ),
    );
  }
}

2

https://pub.dev/packages/mobkit_dashed_border 你可以使用这个软件包。这个软件包不使用小部件,它创建了一种新的边框类型。你可以在任何使用边框的地方使用它。

Container(
    height: 75,
    decoration: const BoxDecoration(
        border: DashedBorder.fromBorderSide(
            dashLength: 15, side: BorderSide(color: Colors.black, width: 2)),
        borderRadius: BorderRadius.all(Radius.circular(10))),
    child: const Center(
        child: Text(
            'Rounded same color and width',
        ),
    ),
),

enter image description here

Container(
    height: 75,
    decoration: const BoxDecoration(
    border: DashedBorder(
        dashLength: 15,
        left: BorderSide(color: Colors.black, width: 2),
        top: BorderSide(color: Colors.red, width: 2),
        right: BorderSide(color: Colors.orange, width: 2),
        bottom: BorderSide(color: Colors.blue, width: 2),
    ),
    borderRadius: BorderRadius.only(
        topLeft: Radius.circular(0),
        topRight: Radius.circular(20),
        bottomLeft: Radius.circular(20),
        bottomRight: Radius.circular(0),
    ),
    ),
    child: const Center(
        child: Text(
            'Different rounded and color',
        ),
    ),
),

enter image description here


-1
Container(
      margin: EdgeInsets.symmetric(horizontal: 10, vertical: 20),
      height: 16,
      width: MediaQuery.of(context).size.width,
      decoration: BoxDecoration(
        color: ThemeConstants.blueGreyDivider,
        borderRadius: BorderRadius.circular(100),
      ),
      child: SingleChildScrollView(
        physics: NeverScrollableScrollPhysics(),
        scrollDirection: Axis.horizontal,
        child: Row(
          children: List.generate(
            MediaQuery.of(context).size.width ~/ (10 + 5),
            (_) => Container(
              width: 10,
              height: 2,
              color: Colors.white,
              margin: EdgeInsets.only(left: 10 / 2, right: 5 / 2),
            ),
          ),
        ),
      ),
    )

引用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接