颤动忽略按钮并执行功能
flutter ignores button and executes function
我开发了一个应用程序,每个操作都有多个按钮,为了让代码更有序,我编写了一个函数来包含一个按钮:
Widget addButton(String msg,Function f){
return Padding(
padding: EdgeInsets.all(3),
child: MaterialButton(
minWidth: 40,
padding: EdgeInsets.all(10),
height: double.maxFinite,
color: Colors.blue,
//icon: Icons.add,
child: Text('${msg}',
style: TextStyle(fontSize: 16.0, color: Colors.white)),
onPressed: () {
f;
},
),
);
}
此函数接收按钮中显示的字符串和按下按钮时将执行的函数。
当用户在文本字段(tipoParc.text)中写入时,按下按钮时将其保存在地图中并显示在应用程序中,负责使应用程序状态发生变化的函数是:
addMedicion(){
setState(() {
print('cambiando ${tipoParc} con ${selOption} \n');
medicionTipe[tipoParc.text]=selOption;
});
}
为了在主代码中一切正常,我这样调用 addButton 函数:
addButton('hello',addMedicion())
但这在按下 addButton 按钮时不起作用,相反,当用户在 textField (typeParc.text) 中写入时,始终执行 addMedicion () 函数显示字符串而不按下按钮
首先,您应该更准确地定义函数签名。而不是 addButton(String msg, Function f)
这样做:addButton(String msg, void Function() f)
(取决于您需要的 return 值和参数)。
其次,除了函数签名不同之外,你不需要定义一个只调用函数的函数。这样做:
Widget addButton(String msg, void Function() f) {
return Padding(
padding: EdgeInsets.all(3),
child: MaterialButton(
// more params
onPressed: f,
// onPressed: () => f(), ALTERNATIVE
),
);
}
如果您的函数签名不同(i.ex 函数需要 context
来执行它的操作),您可以这样做:
Widget addButton(String msg, void Function(BuildContext context) f) {
return Padding(
padding: EdgeInsets.all(3),
child: MaterialButton(
// more params
onPressed: () => f(context),
),
);
}
最后,您应该只将函数名称传递给不带大括号的方法。不要调用 addButton('hello', addMedicon())
,而是调用 addButton('hello', addMedicon)
.
最后但同样重要的是,MaterialButton 已过时。使用 RawMaterialButton 或一些实现(FlatButton、OutlinedButton、RaisedButton)。有关详细信息,请查看 link.
下的文档
我开发了一个应用程序,每个操作都有多个按钮,为了让代码更有序,我编写了一个函数来包含一个按钮:
Widget addButton(String msg,Function f){
return Padding(
padding: EdgeInsets.all(3),
child: MaterialButton(
minWidth: 40,
padding: EdgeInsets.all(10),
height: double.maxFinite,
color: Colors.blue,
//icon: Icons.add,
child: Text('${msg}',
style: TextStyle(fontSize: 16.0, color: Colors.white)),
onPressed: () {
f;
},
),
);
}
此函数接收按钮中显示的字符串和按下按钮时将执行的函数。
当用户在文本字段(tipoParc.text)中写入时,按下按钮时将其保存在地图中并显示在应用程序中,负责使应用程序状态发生变化的函数是:
addMedicion(){
setState(() {
print('cambiando ${tipoParc} con ${selOption} \n');
medicionTipe[tipoParc.text]=selOption;
});
}
为了在主代码中一切正常,我这样调用 addButton 函数:
addButton('hello',addMedicion())
但这在按下 addButton 按钮时不起作用,相反,当用户在 textField (typeParc.text) 中写入时,始终执行 addMedicion () 函数显示字符串而不按下按钮
首先,您应该更准确地定义函数签名。而不是 addButton(String msg, Function f)
这样做:addButton(String msg, void Function() f)
(取决于您需要的 return 值和参数)。
其次,除了函数签名不同之外,你不需要定义一个只调用函数的函数。这样做:
Widget addButton(String msg, void Function() f) {
return Padding(
padding: EdgeInsets.all(3),
child: MaterialButton(
// more params
onPressed: f,
// onPressed: () => f(), ALTERNATIVE
),
);
}
如果您的函数签名不同(i.ex 函数需要 context
来执行它的操作),您可以这样做:
Widget addButton(String msg, void Function(BuildContext context) f) {
return Padding(
padding: EdgeInsets.all(3),
child: MaterialButton(
// more params
onPressed: () => f(context),
),
);
}
最后,您应该只将函数名称传递给不带大括号的方法。不要调用 addButton('hello', addMedicon())
,而是调用 addButton('hello', addMedicon)
.
最后但同样重要的是,MaterialButton 已过时。使用 RawMaterialButton 或一些实现(FlatButton、OutlinedButton、RaisedButton)。有关详细信息,请查看 link.
下的文档