Flutter传递Navigator.pop作为VoidCallback给自定义IconButton报void类型错误求助
错误原因
问题由两处不符合Dart函数传递规则的写法导致:
- 给
pressFunction传参时直接执行了Navigator.pop方法,而非传入函数实例Navigator.of(context).pop()写法会在组件build阶段就直接执行页面返回逻辑,该表达式返回值为void,和你声明的VoidCallback函数类型不匹配,直接触发类型报错。 IconButton的onPressed参数赋值逻辑错误() => pressFunction写法仅定义了一个返回pressFunction函数对象的匿名函数,点击按钮时只会返回这个对象,不会执行你传入的回调逻辑。
修正方案
- 修正
InkyIconButton的传参,传入未执行的函数实例:
SliverAppBar( ... leading: InkyIconButton( icon: Icons.arrow_back_ios, pressFunction: () => Navigator.of(context).pop(), ) )
- 修正
InkyIconButton内部的onPressed赋值,两种写法二选一:
class InkyIconButton extends StatelessWidget { const InkyIconButton({ Key? key, required this.icon, required this.pressFunction, }) : super(key: key); final IconData icon; final VoidCallback pressFunction; @override Widget build(BuildContext context) { return Ink( padding: const EdgeInsets.fromLTRB(8.0, 0, 0, 0), decoration: const ShapeDecoration( color: Colors.black, shape: CircleBorder(), ), child: IconButton( padding: EdgeInsets.zero, // 写法1:直接赋值,VoidCallback类型完全匹配 onPressed: pressFunction, // 写法2:需要额外逻辑时可以包裹后调用 // onPressed: () => pressFunction(), icon: Icon(icon)), ); } }
内容的提问来源于stack exchange,提问作者BillyParadise
相关产品推荐
相关产品推荐

