Dart:无法将参数类型“String”分配给参数类型“FutureOr< String>

ca1c2owp  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(168)

我正在尝试使用异步方法,但我遇到了困难。
我想实现一些代码,其目标是在等待2秒后返回一个字符串。
这是我的第一次尝试和相关的错误

String setUserDecision() {
    return 'Yes'; 
}

Future<String> fetchUserDecision() async {
  return await Future.delayed(const Duration(seconds: 2), setUserDecision());
}

Future<void> main() async {
  print("Fetching user role...");
  String decision = await fetchUserDecision();
  print('The user decision is: $decision');
  print("Done");
}
Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<String> Function()?'.
  return await Future.delayed(const Duration(seconds: 2), setUserDecision());

我不能理解这个错误,我可能认为String类型不对,但我不明白如何改变它。我也尝试了这个解决方案,认为它可能有意义(也许),但什么都没有。

Future<String> setUserDecision() async{
    return await 'Yes'; 
}

Future<String> fetchUserDecision() async {
  return await Future.delayed(const Duration(seconds: 2), setUserDecision());
}

Future<void> main() async {
  print("Fetching user role...");
  String decision = await fetchUserDecision();
  print('The user decision is: $decision');
  print("Done");
}

还有这个

import 'dart:async';

String setUserDecision() {
    return  'Yes'; 
}

Future<String> fetchUserDecision() async {
  return await Future.delayed(const Duration(seconds: 2), setUserDecision() as FutureOr<String> Function()?);
}

Future<void> main() async {
  print("Fetching user role...");
  String decision = await fetchUserDecision();
  print('The user decision is: $decision');
  print("Done");
}

这个错误

_CastError (type 'String' is not a subtype of type '(() => FutureOr<String>)?' in type cast)

唯一可行的办法就是这个

Future<String> fetchUserDecision() async {
  return await Future.delayed(const Duration(seconds: 2), () {
    return 'Yes'; 
});
}

Future<void> main() async {
  print("Fetching user role...");
  String decision = await fetchUserDecision();
  print('The user decision is: $decision');
  print("Done");
}

但我想更好地了解错误的类型以及如何修复它。

8fsztsew

8fsztsew1#

你的问题是,你正在调用你的setUserDecision()函数,并将其结果发送给Future.delayed,而Future.delayed需要一个函数。由于调用setUserDecision()的结果是String,你最终提供的是String而不是Function,这让Dart抱怨。
你应该这样做:

Future<String> fetchUserDecision() async {
  return await Future.delayed(const Duration(seconds: 2), setUserDecision);
}

注意,我已经删除了setUserDecision后面的()。现在我们将函数作为函数提供,而不是调用它。

相关问题