为不同的小部件提供相同的构造函数参数


我创建了两个按钮,但它们有共同的构造函数参数。我不想再写同样的参数了。我想从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",)

我该如何解决这个问题?

问题是:您的构造函数参数没有类型(因此是动态的(,并且没有分配给来自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...
),

最新更新