Flutter报错:This expression has a type of 'void' so its value can't be used 求助
解决Flutter中"This expression has a type of 'void' so its value can't be used"错误
核心问题分析
你遇到的错误根源有三个:
- 父组件传递方法时,错误地调用了方法(加了括号
()),导致传递的是方法执行后的void返回值,而非方法本身 - 子组件
TapboxB中错误地将incrementCounter定义为int类型,实际上它是一个无参无返回值的方法 - 子组件中调用
incrementCounter时,仅引用方法变量未加括号执行,无法触发方法逻辑
修复步骤及代码
1. 修正TapboxB的参数类型
把incrementCounter的类型从int改为VoidCallback(Flutter内置的无参无返回值回调类型),或者显式声明void Function():
class TapboxB extends StatelessWidget { final bool active; final ValueChanged<bool> onChanged; final List scrambles; final int counter; // 修正类型:从int改为VoidCallback final VoidCallback incrementCounter; const TapboxB({ super.key, this.active = false, required this.incrementCounter, required this.onChanged, required this.scrambles, required this.counter, }); void _handleTap() { onChanged(!active); } @override Widget build(BuildContext context) { return GestureDetector( onTap: _handleTap, child: Container( width: 200, height: 200, decoration: const BoxDecoration(color: null), child: Center( child: TextButton( onPressed: () { // 修正:加括号执行方法 incrementCounter(); }, child: Text('${scrambles[counter % scrambles.length]}'), ), ), ), ); } }
2. 修正父组件传递方法的方式
去掉incrementCounter后面的括号,传递方法引用而非执行方法:
@override Widget build(BuildContext context) { return SizedBox( child: TapboxB( active: active, onChanged: _handleTapboxChanged, scrambles: scrambles, counter: counter, // 修正:去掉括号,传递方法本身 incrementCounter: incrementCounter, ), ); }
修复思路说明
- 方法作为参数传递时,要传递方法引用(不带括号),加括号会立即执行方法并返回结果(这里
incrementCounter()返回void,因此触发类型错误) - 回调参数的类型必须和传递的方法类型匹配,
incrementCounter是无参无返回值的方法,所以要用VoidCallback或void Function()类型,而非int - 需要执行方法时,必须加括号
()触发执行,仅引用方法变量不会触发任何逻辑
内容的提问来源于stack exchange,提问作者Spicy Pumpkin
相关产品推荐
相关产品推荐

