You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter自定义按钮传参时报type 'Null' is not a subtype of type Function错误如何解决

错误产生原因
  • 你在给ToolSetButton的function参数传值时,写的是function: testFunc(ButtonList.Two),该写法会直接执行testFunc函数,而非把函数本身作为参数传递。testFunc没有返回值(返回类型为void/Null),最终传给function属性的是Null,和声明的Function类型不匹配,因此触发运行时报错。
  • 额外隐含问题:当前写法会在组件初始化阶段就执行testFunc,和预期的「点击按钮时才执行」逻辑不符,即使没有类型错误也无法实现需求。
修复方案

1. 修复传参逻辑(必改)

用闭包包裹带参数的函数,将函数对象而非函数执行结果传给组件。把页面2的组件传参代码修改为:

function: () => testFunc(ButtonList.Two),

该写法传递的是无参函数对象,点击按钮时才会执行内部的testFunc(ButtonList.Two)逻辑,同时类型符合Function的要求。


2. 优化类型声明(可选,提升安全性)

给组件的回调属性声明明确的函数类型,避免后续出现同类类型错误,修改页面1的组件定义代码:

// VoidCallback是Flutter官方定义的无参无返回值回调类型,等价于void Function()
typedef ToolSetCallback = VoidCallback;

class ToolSetButton extends StatefulWidget {
  final ToolSetCallback function;
  const ToolSetButton({
    super.key,
    this.function = defaultFunction,
  });
}

void defaultFunction() {
  print('Button Tapped');
}

3. 简化点击调用逻辑

无需使用Function.apply,直接调用函数即可,还可增加非空判断避免空异常,修改页面3的调用代码:

child: InkWell(
  splashColor: Colors.white,
  // 可选链调用,function为null时不会执行,兼容性更强
  onTap: () => widget.function.call(),
  // 也可直接简写为 onTap: widget.function
),

内容的提问来源于stack exchange,提问作者Pretty_Girl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:54:03