Flutter(Dart)中如何沿Widget树正确传值给CustomPainter
传值实现方法
按照以下三步修改即可实现参数正确传递+值变化同步更新:
- 给图表组件增加三个必填属性,接收父组件传入的最小值、最大值、当前值
- 给自定义Painter增加同名成员属性,组件初始化Painter时把接收到的参数透传进去
- 重写Painter的
shouldRepaint方法,参数变化时返回true触发重绘,保证setState后UI同步更新
完整修改后代码
图表组件部分
// 注:Dart规范建议类名使用大驼峰,这里把原类名gaugeChart调整为GaugeChart,你也可以保留原命名 class GaugeChart extends StatefulWidget { final double min; final double max; final double value; // 构造函数声明三个必填参数 const GaugeChart({ super.key, required this.min, required this.max, required this.value, }); @override State<GaugeChart> createState() => _GaugeChartState(); } class _GaugeChartState extends State<GaugeChart> { @override Widget build(BuildContext context) { return CustomPaint( // 透传三个参数给自定义Painter painter: GaugeChartPainter( min: widget.min, max: widget.max, value: widget.value, ), // 建议给CustomPaint加尺寸约束,避免在ListView中因尺寸为0无法显示内容 child: const SizedBox( width: double.infinity, height: 200, ), ); } } class GaugeChartPainter extends CustomPainter { final double min; final double max; final double value; GaugeChartPainter({ required this.min, required this.max, required this.value, }); @override void paint(Canvas canvas, Size size) { // 此处可直接调用min、max、value完成绘制逻辑 // 示例:计算当前值在区间内的占比 final valueRatio = (value.clamp(min, max) - min) / (max - min); // 自定义绘制逻辑写在此处 } @override bool shouldRepaint(covariant GaugeChartPainter oldDelegate) { // 参数任意一项变化时触发重绘 return oldDelegate.min != min || oldDelegate.max != max || oldDelegate.value != value; } }
父组件调用调整
把原来的位置参数传值改成对应命名参数即可:
class Home extends StatefulWidget { const Home({super.key}); @override State<Home> createState() => _HomeState(); } class _HomeState extends State<Home> { // 示例变量,实际为你自己的业务值 double cpuUsage = 30; double memoryUsage = 65; @override Widget build(BuildContext context) { return Container( child: ListView(children: [ GaugeChart(min: 0, max: 100, value: cpuUsage), GaugeChart(min: 0, max: 100, value: memoryUsage) ]), ); } }
注意:如果不重写
shouldRepaint方法,即使父组件setState更新了value值,CustomPainter也不会自动触发重绘,会出现数值变了但图表没更新的问题。
内容的提问来源于stack exchange,提问作者ciErOUrD
相关产品推荐
相关产品推荐

