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

如何扩展Flutter TextButton并解决invalid constant value报错

问题解决:继承TextButton抛出invalid constant value错误

错误原因

你为KMTextButton声明了const构造函数,但向父类TextButton传递的onPressed参数是动态创建的匿名函数,Dart中匿名函数不属于编译时常量,无法在const构造的初始化列表中使用,因此触发常量值非法的报错。

解决方案

方案1:移除构造函数的const修饰

如果你的KMTextButton不需要作为常量组件使用,直接删除构造函数前的const关键字即可,修改后代码如下:

class KMTextButton extends TextButton {
  // 移除const修饰
  KMTextButton({
    Key? key,
    required VoidCallback? onPressed,
    VoidCallback? onLongPress,
    ButtonStyle? style,
    FocusNode? focusNode,
    bool autofocus = false,
    Clip clipBehavior = Clip.none,
    required Widget child,
  }) : super(
    key: key,
    onPressed: (){
      print('onPressedFuncInvoked');
      if (onPressed != null) {
        onPressed();
      }
    },
    onLongPress: onLongPress,
    style: style,
    focusNode: focusNode,
    autofocus: autofocus,
    clipBehavior: clipBehavior,
    child: child,
  );
}

方案2:改用组合方式封装组件(更推荐)

Flutter官方优先推荐使用组合而非继承的方式自定义组件,这种方式可以保留const构造的能力,后续扩展逻辑也更灵活,代码实现如下:

class KMTextButton extends StatelessWidget {
  final VoidCallback? onPressed;
  final VoidCallback? onLongPress;
  final ButtonStyle? style;
  final FocusNode? focusNode;
  final bool autofocus;
  final Clip clipBehavior;
  final Widget child;

  const KMTextButton({
    Key? key,
    required this.onPressed,
    this.onLongPress,
    this.style,
    this.focusNode,
    this.autofocus = false,
    this.clipBehavior = Clip.none,
    required this.child,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return TextButton(
      onPressed: () {
        print('onPressedFuncInvoked');
        onPressed?.call();
      },
      onLongPress: onLongPress,
      style: style,
      focusNode: focusNode,
      autofocus: autofocus,
      clipBehavior: clipBehavior,
      child: child,
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:24:04