如何在flutter中传递回调

pal*_*ara 5 dart flutter

代码将解释所有: -

    class ResultOverlay extends StatefulWidget {

      final bool _isCorrect;
      VoidCallback _onTap;

      ResultOverlay(this._isCorrect, this._onTap);
      ......
      ......
}
Run Code Online (Sandbox Code Playgroud)

它的州级

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

传递回调函数: -

new ResultOverlay(isCorrect, () {
                        () => CallAnswerPage();
                      })
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?提前致谢 :)

Sur*_*gch 16

对于未来的观众来说,这是一个更普遍的答案。

回调类型

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

final VoidCallback myVoidCallback = () {};
final ValueGetter<int> myValueGetter = () => 42;
final ValueSetter<int> myValueSetter = (value) {};
Run Code Online (Sandbox Code Playgroud)

注意事项

  • VoidCallback是一个匿名函数,它不接受任何参数并且不返回任何值。
  • ValueGetter是一个匿名函数,它返回一个值,您提供给想要获取它的人。
  • ValueSetter是一个匿名函数,它将一个值作为参数,您可以使用它来设置其他一些值。

有关更多详细信息,请参阅此答案

编写回调的方法

好的

当您被要求为 API 提供回调时,您可以直接编写回调:

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

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

onPressed: myVoidCallback,
Run Code Online (Sandbox Code Playgroud)

不太好

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

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

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

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

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

还好

例外情况是,如果您想在参数仅要求 void 回调时执行诸如调用值设置器之类的操作:

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


pal*_*ara 12

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

new ResultOverlay(isCorrect, 
                      () => callAnswerPage()
                    )
Run Code Online (Sandbox Code Playgroud)

这么傻的错误:)


Rém*_*let 8

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

改变

    onTap: () => widget._onTap,
Run Code Online (Sandbox Code Playgroud)

    onTap: widget._onTap,
Run Code Online (Sandbox Code Playgroud)

在你的State班级里