我正在使用颤振在我的应用程序中构建一个盒子布局列表。我想要盒子周围的虚线边框。我已经使用card
小部件来创建盒子。但是,我怎样才能在盒子周围得到虚线边框?
6 回答
编辑
我已将此作为包添加到pub中。
现在,你需要做的就是
DottedBorder(
color: Colors.black,
gap: 3,
strokeWidth: 1,
child: FlutterLogo(size: 148),
)
工作解决方案[过时]
就像tomerpacific在这个答案中所说的那样,Flutter 目前没有虚线边框的默认实现。
我昨天工作了一段时间,并且能够使用CustomPainter
. 希望这可以帮助某人。
像这样添加DashedRect
到您的容器中
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Container(
height: 400,
width: 300,
color: Colors.black12,
child: DashedRect(color: Colors.red, strokeWidth: 2.0, gap: 3.0,),
),
),
);
}
}
虚线矩形.dart
import 'package:flutter/material.dart';
import 'dart:math' as math;
class DashedRect extends StatelessWidget {
final Color color;
final double strokeWidth;
final double gap;
DashedRect(
{this.color = Colors.black, this.strokeWidth = 1.0, this.gap = 5.0});
@override
Widget build(BuildContext context) {
return Container(
child: Padding(
padding: EdgeInsets.all(strokeWidth / 2),
child: CustomPaint(
painter:
DashRectPainter(color: color, strokeWidth: strokeWidth, gap: gap),
),
),
);
}
}
class DashRectPainter extends CustomPainter {
double strokeWidth;
Color color;
double gap;
DashRectPainter(
{this.strokeWidth = 5.0, this.color = Colors.red, this.gap = 5.0});
@override
void paint(Canvas canvas, Size size) {
Paint dashedPaint = Paint()
..color = color
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke;
double x = size.width;
double y = size.height;
Path _topPath = getDashedPath(
a: math.Point(0, 0),
b: math.Point(x, 0),
gap: gap,
);
Path _rightPath = getDashedPath(
a: math.Point(x, 0),
b: math.Point(x, y),
gap: gap,
);
Path _bottomPath = getDashedPath(
a: math.Point(0, y),
b: math.Point(x, y),
gap: gap,
);
Path _leftPath = getDashedPath(
a: math.Point(0, 0),
b: math.Point(0.001, y),
gap: gap,
);
canvas.drawPath(_topPath, dashedPaint);
canvas.drawPath(_rightPath, dashedPaint);
canvas.drawPath(_bottomPath, dashedPaint);
canvas.drawPath(_leftPath, dashedPaint);
}
Path getDashedPath({
@required math.Point<double> a,
@required math.Point<double> b,
@required gap,
}) {
Size size = Size(b.x - a.x, b.y - a.y);
Path path = Path();
path.moveTo(a.x, a.y);
bool shouldDraw = true;
math.Point currentPoint = math.Point(a.x, a.y);
num radians = math.atan(size.height / size.width);
num dx = math.cos(radians) * gap < 0
? math.cos(radians) * gap * -1
: math.cos(radians) * gap;
num dy = math.sin(radians) * gap < 0
? math.sin(radians) * gap * -1
: math.sin(radians) * gap;
while (currentPoint.x <= b.x && currentPoint.y <= b.y) {
shouldDraw
? path.lineTo(currentPoint.x, currentPoint.y)
: path.moveTo(currentPoint.x, currentPoint.y);
shouldDraw = !shouldDraw;
currentPoint = math.Point(
currentPoint.x + dx,
currentPoint.y + dy,
);
}
return path;
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}
我不希望这适用于所有用例,并且有很大的定制和改进空间。如果您发现任何错误,请发表评论。
这是一个fdottedline颤振包,可轻松在小部件周围添加虚线边框。这使用最简单的方法来创建虚线视图,并为开发人员提供创建虚线的能力。它还支持为 [Widget] 创建虚线边框。支持控制虚线边框的粗细、间距和角。
要使用此包,请在文件中添加fdottedline作为依赖项。
pubspec.yaml
用法:虚线形状演示
FDottedLine( color: Colors.lightBlue[600], height: 100.0, width: 50, strokeWidth: 2.0, dottedLength: 10.0, space: 2.0, )
您可以使用dotted_border Flutter 包
return DottedBorder(
borderType: BorderType.RRect,
radius: Radius.circular(20),
dashPattern: [10, 10],
color: Colors.grey,
strokeWidth: 2,
child: Card(
color: Colors.amber,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
child: Center(child: Text("hi")),
)
最近 Flutter 发布了一个用于在小部件周围绘制虚线边框的插件
https://pub.dev/packages/dotted_border
使用此插件,您可以绘制虚线或虚线边框
//1. Install the plugin by add dependencies in pubspace.yaml
dotted_border: ^1.0.6
添加以下代码以显示边框
DottedBorder(
color: Colors.black,
strokeWidth: 1,
child: FlutterLogo(size: 148),
)
目前,Flutter 不支持虚线边框,因为只有两种样式:
Solid or None
要为您的小部件添加边框,您需要执行以下操作:
将 BoxDecoration 属性添加到您的小部件
BoxDecoration 的部分属性是border
decoration: BoxDecoration( border: Border.all( width: 1, style: BorderStyle.solid/none ), );
我还发现了这个 SO question,它演示了如何添加圆形虚线边框。
如果您想应用一些动画或删除\添加边框功能 onTap(如照明边框)事件或类似事件,BorderStyle.none 会很有用。