Flutter向子Widget传递Widget的正确方式及setState不重建问题
问题原因
你的自定义组件更新不生效的核心原因是:你在State类中手动存储了构造函数传入的子组件副本,State实例在父组件刷新时会被复用,仅在初始化时接收一次参数,后续父组件setState传入的新子组件不会同步到State的局部变量中,因此不会触发重绘。同时你的代码还存在构造函数名和类名不一致、Widget属性未声明为final的语法问题。
修正后的完整实现
class MyPainterWrapper extends StatefulWidget { // Widget自身属性必须声明为final,因为Widget是不可变配置项 final Widget? childWidget; // 构造函数名必须和类名一致,你之前错误写为SceneRender const MyPainterWrapper({super.key, this.childWidget}); @override State<MyPainterWrapper> createState() => _MyPainterWrapperState(); } class _MyPainterWrapperState extends State<MyPainterWrapper> { // 不要手动存储父组件传入的参数,直接通过widget.xxx访问最新值 @override Widget build(BuildContext context) { return Column( children: [ CustomPaint( painter: MyPainter(), // 直接取widget属性,每次build都会拿到最新的传入值 child: widget.childWidget, ) ], ); } } // 补充CustomPainter的标准实现,避免不必要的重绘 class MyPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { // 你的自定义绘制逻辑 } // 如果绘制内容固定返回false即可,有动态绘制条件可自行修改判断逻辑 @override bool shouldRepaint(covariant CustomPainter oldDelegate) => false; }
调用方式说明
父组件调用时无需修改原有逻辑,直接传入子组件即可:
body: MyPainterWrapper( child: Center(/* 你的原有子组件逻辑 */) )
内容的提问来源于stack exchange,提问作者Hans Donkersloot
相关产品推荐
相关产品推荐

