在Navigator上使用then方法的语法问题

时间:2018-03-29 17:06:07

标签: dart flutter

我有以下代码段:

_openEditListingDialog(Listing listing,
    Function(Listing) onSubmittedCallback) async {
      Navigator
      .of(context)
      .push(
        new MaterialPageRoute<Listing>(
          builder: (BuildContext context) {
            return new ListingDialog.edit(listing);
          },
          fullscreenDialog: true,
        ),
      )
      .then((Listing newEntry) {
        if (newEntry != null) {
          newEntry.id = listing.id;
          onSubmittedCallback(newEntry);
        }
      });
  }

VSCode在 .then 行上抱怨,并出现以下错误:

[dart] The argument type '(Listing) -> Null' can't be assigned to the parameter type '(Object) -> FutureOr<Null>'.

这是什么意思,我该如何纠正?我是新手dart and flutter,这样的错误信息对我来说很神秘。我的代码基于此示例:https://github.com/MSzalek-Mobile/weight_tracker/blob/v0.4.1/lib/home_page.dart

2 个答案:

答案 0 :(得分:0)

TBH我不确定为什么VS Code会将此标记为您的错误 - 我认为它没有任何实质性错误,我的VS代码或IntelliJ也没有。我粘贴你的代码,在添加了一个Listing类后,我完全没有问题(对于记录,如果你粘贴了足够的代码,当有问题时某人可以实际运行的东西让它们更容易帮助你)。

在这种特殊情况下,错误的行号可能非常有用。

也许确保你的VS Code和Flutter是最新的(我使用的主通道/分支已更新为dart 2.0,因此可能是它的一部分......)。

您可以尝试一些事情。首先,好像你的push方法没有找到正确的类型 - 我很确定你所看到的错误是在它所期望的.then(...和对象而你是告诉它是一个清单。您可以将.push更改为.push<Listing>以强制它返回列表。

接下来,我实际上并不熟悉您在使用Function(清单)时所做的事情。我不认为这是正确的飞镖,或者至少是这样。我认为推荐的方法是使用正确的参数类型(即typedef void ListingCallback(Listing listing);)键入一个方法,然后使用它作为参数,如果你要使用回调(请参阅后面的答案)可以说是更好的选择。)

你做错的另一件事,很多人似乎最初在飞镖/扑动中做错了,是误用async。如果您在方法签名中使用async,则不应将.then用于期货,而应使用await。请参阅有效飞镖的herethis部分。我已经重新编写了你的​​代码来正确地做到这一点:

//outside class somewhere
typedef void ListingCallback(Listing listing);

...

  _openEditListingDialog(
      Listing listing, ListingCallback onSubmittedCallback) async {
    Listing newEntry = await Navigator.of(context).push<Listing>(
          new MaterialPageRoute<Listing>(
            builder: (BuildContext context) {
              return new ListingDialog.edit(listing);
            },
            fullscreenDialog: true,
          ),
        );

    if (newEntry != null) {
      newEntry.id = listing.id;
      onSubmittedCallback(newEntry);
    }
  }

请注意,这也会消除导致您出现问题的整个功能。

此外,您可以使用期货并删除方法签名中的async,但之后您必须确保实际返回未来。

最后,你可以(应该)返回一个Future而不是传递一个回调。

  Future<Listing> _openEditListingDialog(Listing listing) async {
    Listing newEntry = await Navigator.of(context).push<Listing>(
          new MaterialPageRoute<Listing>(
            builder: (BuildContext context) {
              return new ListingDialog.edit(listing);
            },
            fullscreenDialog: true,
          ),
        );

    if (newEntry != null) {
      newEntry.id = listing.id;
    }

    return newEntry;
  }

答案 1 :(得分:-1)

您传递了一项功能

parent record

这意味着Dart推断返回类型Function(Listing) onSubmittedCallback) async { // no return here });

我认为将其改为

Null

并删除末尾的FutureOr<Null> Function(Listing) onSubmittedCallback) async => (代码的最后一行)应修复它。

如果你想保持功能体}使用

{...}