我有以下代码段:
_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。
答案 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
。请参阅有效飞镖的here和this部分。我已经重新编写了你的代码来正确地做到这一点:
//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 =>
(代码的最后一行)应修复它。
如果你想保持功能体}
使用
{...}