如何在 Flutter 中传递回调

How to pass callback in Flutter

代码会全部解释:

    class ResultOverlay extends StatefulWidget {
    
      final bool _isCorrect;
      VoidCallback _onTap;
    
      ResultOverlay(this._isCorrect, this._onTap);
      ......
      ......
}

其状态class:

class ResultOverlayState extends State<ResultOverlay>{
@override
  Widget build(BuildContext context) {
    ........
      child: new InkWell(
        onTap: () => widget._onTap,
.....
.....
}

回调函数的传递:

new ResultOverlay(isCorrect, () {
                        () => CallAnswerPage();
                      })

我在这里缺少什么?

一切都很好,除了你如何使用它。

改变

    onTap: () => widget._onTap,

    onTap: widget._onTap,

在你的Stateclass

里面

我没有正确传递回调。这是正确的语法:

new ResultOverlay(
    isCorrect, 
    () => callAnswerPage()
)

如此愚蠢的错误:)

这是为未来的观众提供的更笼统的答案。

回调类型

有几种不同类型的预定义回调:

final VoidCallback myVoidCallback = () {};
final ValueGetter<int> myValueGetter = () => 42;
final ValueSetter<int> myValueSetter = (value) {};

备注:

  • VoidCallback 是一个匿名函数,不带任何参数,returns 没有值。
  • ValueGetter 是一个匿名函数,它 returns 一个值,你提供给想要 get 它的人。
  • ValueSetter 是一个匿名函数,它接受一个值作为参数,您可以使用它来 set 一些其他值。

有关详细信息,请参阅

回调的写法

当你被要求提供回调给一个API时,你可以直接写回调:

onPressed: () {},

或者您可以提供回调变量名称(不带括号):

onPressed: myVoidCallback,

不太好

使用这两种形式会不必要地冗长(但如果在变量名后加上括号就可以):

onPressed: () {
  myVoidCallback();
},

这个是等效的(但也不必要地冗长):

onPressed: () => myVoidCallback(),

只需使用上面的“好”形式之一。

还不错

如果您想在参数仅请求 void 回调时调用值 setter,则例外:

onPressed: () => myValueSetter(42),