web-dev-qa-db-fra.com

Passer une fonction avec des paramètres à un VoidCallback

Est-il possible de passer une fonction avec des paramètres à un VoidCallback?

par exemple quelque chose comme ceci:

class MyClass {
  void doSomething(int i){

  }

  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}


class MyOtherClass {
  final VoidCallback callback(int);

  MyOtherClass(this.callback);

  callback(5);
}
15
Tobias Gubo

La déclaration de VoidCallback est

typedef void VoidCallback();

C'est le type de fonction qui peut être appelée avec zéro argument et qui ne renvoie pas de valeur utile. Cela ne semble pas être ce que vous voulez. Ce que vous voulez vraiment n'est pas tout à fait clair puisque le programme n'est pas syntaxiquement valide, mais est-ce que cela fonctionnerait pour vous:

class MyClass { 
  static doSomething(int i) { /* ... */ }
  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}
class MyOtherClass {
  final void Function(int) callback;
  MyOtherClass(this.callback);
  void callCallaback() { callback(5); }
}

Ici, nous définissons le type du champ callback comme étant le type de fonctions pouvant être appelées avec un seul argument entier et qui ne renvoie aucune valeur utile. La méthode doSomething a ce type, elle peut donc être assignée à callback.

Vous pouvez également utiliser un typedef pour nommer la fonction:

typedef Int2VoidFunc = void Function(int);
// or: typedef void Int2VoidFunc(int arg);
class MyOtherClass {
  final Int2VoidFunc callback;
  MyOtherClass(this.callback);
  void callCallaback() { callback(5); }
}

L'effet est exactement le même, il vous permet simplement d'utiliser un nom plus court pour le type de fonction, mais cela n'a de sens que si vous l'utilisez beaucoup.

33
lrn

créez votre propre rappel à la place

typedef void MyCallback(int foo);

class MyClass {
  void doSomething(int i){

  }

  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}


class MyOtherClass {
  final MyCallback callback;

  MyOtherClass(this.callback);

}
14
Rémi Rousselet

Flutter a déjà un typedef pour ceci: ValueSetter .

Ainsi, vous pouvez passer une instance de ValueSetter<int> à votre autre classe.

4
Duncan Jones

Exemple dans le cas de l'interface utilisateur. Vous devrez peut-être créer un widget et transmettre la fonction click.

1.Créer un widget avec fonction en tant que paramètre dans le constructeur.

Container _cardButton({
  Function onClickAction,
}) {
  return Container(
    width: 340,
    height: 90,
    child: InkWell(
      splashColor: Colors.blue.withAlpha(30),
      onTap: () {
        onClickAction();
      },
      child: Card(
        elevation: 5,
        child: somechild,
      ),
    ),
  );

2. Implémente le widget dans la vue trois et passe la fonction comme ceci

_cardButton(
    onClickAction: () => {debugPrint("CLICKED")},
),
3
Jack the Ripper