Flutter 自定义Widget-CheckBox
文章目录
- 1. 继承CustomPainter
- 2. void paint(Canvas canvas, Size size) 画图
- 3. bool shouldRepaint(CustomPainter oldDelegate) 判断是否重绘
- 4. 使用RepaintBoundary和CustomPaint
- 5. 添加点击事件GestureDetector和背景用组合的方式
- 其他类似,就是熟悉Canvas和Paint的API
- 怎么在外面修改 _CheckTextBox 的isChecked的值呢?
- flutter checkbox 源码学习(配置文件)
1. 继承CustomPainter 2. void paint(Canvas canvas, Size size) 画图 3. bool shouldRepaint(CustomPainter oldDelegate) 判断是否重绘 4. 使用RepaintBoundary和CustomPaint 5. 添加点击事件GestureDetector和背景用组合的方式 其他类似,就是熟悉Canvas和Paint的API
///抽取出来缩小刷新区域
class MyCheckBox extends StatefulWidget {
// 是否是check状态
final bool isChecked;
final Color colorBg;
final Color color;
final double size;
// check回传
final ValueChanged onChecked;
MyCheckBox({this.isChecked, this.colorBg = Colors.red,this.color = Colors.blue, this.onChecked,this.size = 300});
@override
State createState() => _CheckTextBox(isChecked: isChecked);
}class _CheckTextBox extends State {
// 是否是check状态
bool isChecked;
_CheckTextBox({this.isChecked: false});
@override
Widget build(BuildContext context) {
return Container(
color: widget.colorBg,
child: GestureDetector(
onTap: () {
setState(() {
isChecked = !isChecked;
// 回传改变事件
if (widget.onChecked != null) widget.onChecked(isChecked);
});
},
///防止过度重绘
child: RepaintBoundary(
child: CustomPaint(
size: Size(widget.size, widget.size),
painter: MyCheckBoxPainter(isCheck: isChecked),
),
),
),
);
}
}class MyCheckBoxPainter extends CustomPainter {
final _paint = Paint();
bool isCheck = false;
Color color;
set checked(bool newValue) {
if (newValue != isCheck) {
isCheck = newValue;
}
}MyCheckBoxPainter({this.isCheck = false, this.color = Colors.blue}) {
_paint.color = color;
//白色笔
_paint.isAntiAlias = true;
// 抗锯齿
}@override
void paint(Canvas canvas, Size size) {
// TODO: implement paintdouble _center = size.height / 2;
//中心点
_paint.strokeWidth = size.height * 0.12;
double _radius = _center - _paint.strokeWidth / 2;
//半径
_paint.style = PaintingStyle.stroke;
// 设置空心笔
///圆形半径为(width-笔的宽度)/2
///画弧形是矩形内切
canvas.drawCircle(Offset(_center, _center), _radius, _paint);
if (isCheck) {
_paint.style = PaintingStyle.fill;
canvas.drawCircle(Offset(_center, _center), _radius / 2, _paint);
}
}@override
bool shouldRepaint(CustomPainter oldDelegate) {
// TODO: implement shouldRepaint
return (oldDelegate as MyCheckBoxPainter).isCheck != isCheck;
}
}
怎么在外面修改 _CheckTextBox 的isChecked的值呢?
【Flutter 自定义Widget-CheckBox】现在私有无法获取_CheckTextBox的实例对象,更无法修改flutter checkbox 源码学习(配置文件)
先去掉_,然后通过GlobalKey.currentState获取并修改
(myCheckBoxKey.currentState as CheckTextBox).isChecked = check;
- class Checkbox extends StatefulWidget
- class _CheckboxState extends State with TickerProviderStateMixin
- class _CheckboxRenderObjectWidget extends LeafRenderObjectWidget
- class _RenderCheckbox extends RenderToggleable
- FocusableActionDetector
- RenderToggleable 需要一个TickerProvider
推荐阅读
- SpringBoot调用公共模块的自定义注解失效的解决
- python自定义封装带颜色的logging模块
- 列出所有自定义的function和view
- Flutter的ListView
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
- 自定义MyAdapter
- 运用flutter|运用flutter 构建一个发布版(release)APK
- Android自定义view实现圆环进度条效果
- Flutter自定义view|Flutter自定义view —— 闯关进度条
- js保留自定义小数点