0

我创建了两个按钮,但它们具有通用的构造函数参数。我不想再次编写相同的参数。我想从 mixin 或类中调用所有按钮的参数。我的按钮如下:

  1. 自定义文本按钮:

     class HTextButton extends StatelessWidget {
     final TextStyle style;
     final Function() onPressed;
     final ButtonStyle? buttonStyle;
     final String title;
     const HTextButton(this.title,{Key? key, required this.onPressed, required this.style, 
    this.buttonStyle}) : super(key: key);
    
           @override
        Widget build(BuildContext context) {   
    
        return TextButton(
        style: buttonStyle,
         onPressed: onPressed, child: Text(title,style: style,));
        }
        }
    
  2. 提交按钮:

    class SubmitButton extends StatelessWidget {
     final TextStyle style;
     final Function()? onPressed;
     final Function()? onLongPressed;
     final ButtonStyle buttonStyle;
     final String title;
    
       const SubmitButton(this.title,
       {Key? key,
       required this.onPressed,
       required this.onLongPressed,
       required this.style,
       required this.buttonStyle})
       : super(key: key);
    
     @override
     Widget build(BuildContext context) {
     return ElevatedButton(
         style: buttonStyle,
         child: Text(title, style: style),
         onPressed: onPressed,
         onLongPress: onLongPressed);
     }
    }
    

我创建了 mixin 来解决这个问题:

mixin ButtonFeatures {
 late final TextStyle style;
 late final Function() onPressed;
 late final ButtonStyle? buttonStyle;
 late final String title;
 late final Function() onLongPressed;
}

这是我的自定义按钮的示例用法:

class HTextButton extends StatelessWidget with ButtonFeatures{

    HTextButton(title,{Key? key, required onPressed, required style, buttonStyle}) : super(key: key);

 @override
 Widget build(BuildContext context) {


return TextButton(
  style: buttonStyle,
    onPressed: onPressed, child: Text(title,style: style,));
 }
}

如您所见,title 是一个字符串。但是当我使用如下按钮时,我没有收到任何错误:

HTextButton(12, onPressed: "aaaaa",)

我怎么解决这个问题 ?

4

1 回答 1

0

这就是问题所在:您的构造函数参数没有类型(因此是动态的)并且没有分配给来自 mixin 的字段。

这是修复它的一种方法:

class HTextButton extends StatelessWidget with ButtonFeatures{

  HTextButton(title,{Key? key, required Function() onPressed, required style, buttonStyle}) : super(key: key) {
    this.onPressed = onPressed;
  }

由于它在一个 mixin 中,我们不能只说required this.onPressed,并且由于它late是允许我们在构造函数主体中分配给它的。

稍后您可以像这样使用它:

  child: HTextButton(onPressed: () => print('hello!'), 
    // other parameters...
  ),
于 2022-03-02T07:00:59.283 回答