我创建了两个按钮,但它们有共同的构造函数参数。我不想再写同样的参数了。我想从mixin或类中调用所有按钮的参数。我下面的按钮:
自定义文本按钮:
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,)); } }
提交按钮:
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...
),