【问题标题】:flutter ignores button and executes function颤振忽略按钮并执行功能
【发布时间】:2021-03-06 09:02:23
【问题描述】:

我开发了一个应用程序,每个操作都有几个按钮,并且为了有一个更有序的代码,我编写了一个函数来拥有一个按钮:

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;
            },
          ),
        );

}

此函数接收一个显示在按钮中的字符串和一个在按下按钮时将执行的函数。

当用户在一个textField(tipoParc.text)中写入时,它在按下按钮时保存在一个地图中并显示在应用程序中,负责改变应用程序状态的函数是:

 addMedicion(){
 setState(() {
      print('cambiando ${tipoParc} con ${selOption} \n');
      medicionTipe[tipoParc.text]=selOption;
    });

}

所以我在主代码中调用 addButton 函数,如下所示:

   addButton('hello',addMedicion())

但这在按下 addButton 按钮时不起作用,相反,当用户在 textField (typeParc.text) 中写入时,总是执行 addMedicion () 函数显示字符串而不按下按钮

【问题讨论】:

    标签: flutter dart flutter-layout flutter-dependencies flutter-test


    【解决方案1】:

    首先,您应该更精确地定义函数签名。而不是 addButton(String msg, Function f) 这样做:addButton(String msg, void Function() f)(取决于您所需的返回值和参数)。

    其次,你不需要定义一个只调用一个函数的函数,除非函数签名不同。这样做:

    Widget addButton(String msg, void Function() f) {
    return  Padding(
              padding: EdgeInsets.all(3),
              child: MaterialButton(
                // more params
                onPressed: f,
                // onPressed: () => f(), ALTERNATIVE
              ),
            );
    }
    

    如果您的函数签名不同(例如该函数需要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)。有关更多详细信息,请查看链接下的文档。

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多