Flutter 自定义组件里怎么监听子组件的点击事件?
我在写一个自定义的卡片组件,想在父组件里知道子组件里的按钮被点了,但试了 onTap 回调没生效,不知道是不是写法有问题。
我试着把 onPressed 通过参数传进去,但点按钮的时候父组件收不到通知,控制台也没报错,就是没反应。
class MyCard extends StatelessWidget {
final VoidCallback onButtonTap;
MyCard({required this.onButtonTap});
@override
Widget build(BuildContext context) {
return Card(
child: ElevatedButton(
onPressed: () => onButtonTap(), // 这里应该没问题吧?
child: Text('点我'),
),
);
}
}
问题应该出在调用处,看看你是不是这样用的:
如果打印不出来,有几个可能的原因:
1. Card 组件本身层级问题,有时候 Card 的 margin 或 elevation 可能会影响点击区域。你可以试试把 ElevatedButton 单独拿出来,不包 Card,看能不能收到事件。
2. 看看父组件那边有没有报错,虽然你说控制台没报错,但可能在 build 阶段有异常被 catch 了。
3. 检查一下是不是用了 const 修饰 MyCard,如果是 const MyCard(...) 这种写法,构造函数里的回调可能不生效。
最直接的排查方式:在你的 onButtonTap 回调里先加个 print,如果点按钮时控制台没有任何输出,那说明回调根本没被执行,可以查查是不是 Widget 树重建的问题。
你把调用处的代码贴出来,我帮你看看?