我有一个自定义按钮小部件:
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)
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)
有关更多信息,请参阅文档。
| 归档时间: |
|
| 查看次数: |
15352 次 |
| 最近记录: |