将方法作为参数传递给小部件

Gab*_*iel 22 dart flutter

我有一个自定义按钮小部件:

class Button extends StatelessWidget {
  final String text;

  Button(this.text);

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 50,
      child: SizedBox(
        width: double.infinity,
        child: RaisedButton(
          onPressed: () => {}, // Use the function from parent Widget
          child: Padding(
              padding: EdgeInsets.symmetric(vertical: 13),
              child: Text(
                text,
                style: TextStyle(fontWeight: FontWeight.bold),
              )),
          color: COLOR_BLUE,
          textColor: Colors.white,
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在父小部件中,我想将一个onPressed方法传递给这个按钮小部件:

...
myMethod () => {
   // do some stuff
}
...
Padding(
    padding: EdgeInsets.only(bottom: 10),
    child: Button("Log in", myMethod),
),
...
Run Code Online (Sandbox Code Playgroud)

如何告诉按钮小部件使用myMethodfor onPress

Geo*_*rge 30

使用VoidCallback类型,像这样。检查我对代码的评论:

class Button extends StatelessWidget {
  final String text;
  final VoidCallback callback; // Notice the variable type

  Button(this.text, this.callback);

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 50,
      child: SizedBox(
        width: double.infinity,
        child: RaisedButton(
          onPressed: callback, // Simply put the function name here, DON'T use ()
          child: Padding(
              padding: EdgeInsets.symmetric(vertical: 13),
              child: Text(
                text,
                style: TextStyle(fontWeight: FontWeight.bold),
              )),
          color: COLOR_BLUE,
          textColor: Colors.white,
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • +1。如果您想要一个接受参数和/或返回结果的方法,您还可以为方法定义自己的 typedef:https://www.dartlang.org/guides/language/language-tour#typedefs (2认同)

Sur*_*gch 25

已经存在一些预定义的类型。

空回调

如果你想创建一个像这样的参数:

onPressed: () { },
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样在你的类中定义它:

onPressed: () { },
Run Code Online (Sandbox Code Playgroud)

笔记

typedef是在这样的源代码中定义:

typedef VoidCallback = void Function();
Run Code Online (Sandbox Code Playgroud)

异步版本是AsyncCallback.

typedef AsyncCallback = Future<void> Function();
Run Code Online (Sandbox Code Playgroud)

值设置器

如果你想创建一个像这样的参数:

onPressed: (value) { },
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样在你的类中定义它:

class MyWidget extends StatelessWidget {

  MyWidget({Key key, this.onPressed}) : super(key: key);

  final VoidCallback onPressed;

  // ...
}
Run Code Online (Sandbox Code Playgroud)

笔记

typedef 在源代码中定义如下:

typedef ValueSetter<T> = void Function(T value);
Run Code Online (Sandbox Code Playgroud)

如果要指定仅在发生更改时调用该函数,请改用 ValueChanged。

typedef ValueChanged<T> = void Function(T value);
Run Code Online (Sandbox Code Playgroud)

异步版本是AsyncValueSetter.

typedef AsyncValueSetter<T> = Future<void> Function(T value);
Run Code Online (Sandbox Code Playgroud)

值获取器

如果你想创建一个像这样的参数:

onPressed: () => value,
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样在你的类中定义它:

typedef VoidCallback = void Function();
Run Code Online (Sandbox Code Playgroud)

笔记

typedef 在源代码中定义如下:

typedef ValueGetter<T> = T Function();
Run Code Online (Sandbox Code Playgroud)

异步版本是AsyncValueGetter.

typedef AsyncValueGetter<T> = Future<T> Function();
Run Code Online (Sandbox Code Playgroud)

定义你自己的类型

从上面的所有示例中可以看出,一切都只是 a typedeffor a Function。所以很容易制作自己的。

假设你想做这样的事情:

onEvent: (context, child) => value,
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样制作typedef:

typedef MyEventCallback = int Function(BuildContext context, Widget widget);
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

typedef AsyncCallback = Future<void> Function();
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅文档