颤动忽略按钮并执行功能

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.

下的文档