флаттер игнорирует кнопку и выполняет функцию

Я разрабатываю приложение, в котором есть несколько кнопок для каждого действия, и чтобы код был более упорядоченным, я написал функцию с кнопкой:

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() показывая строку без нажатия кнопки


person jhoss    schedule 23.11.2020    source источник


Ответы (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). Для получения более подробной информации ознакомьтесь с документацией по ссылке.

person 0x4b50    schedule 23.11.2020