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
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),
),
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
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(),
),
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),
),
),
);
}
}
As long as it is a Rectangular dashed border you want, you can now use dotted_border package which I have uploaded to Pub.
DottedBorder(
color: Colors.black,
gap: 3,
strokeWidth: 1,
child: FlutterLogo(size: 148),
)