【问题标题】:A value of type "Future<Null>" can't be assigned to a variable of type "Data"“Future<Null>”类型的值不能分配给“数据”类型的变量
【发布时间】:2021-03-24 23:59:11
【问题描述】:

我正在尝试弄清楚如何使用 future 来通过 Internet 获取数据。我试图编写一个简单的代码,将 Future 转换为“平均”数据,但它不起作用,我不明白为什么会这样。

这是我的代码

class Fetch {  
  Data getData () {
    Data data;
    data = fetch().then((value) {data = value;}); //here's I'm getting error
  }
  
  Future<Data> fetch() async {
    int number = await Future.delayed(Duration(seconds: 1), () => 3);
    return(Data.fromIt(number));
  }
}


class Data{
  int date;
  
  Data({this.date});
  
  factory Data.fromIt(int num) {
    return Data(
      date: num,
    );
  }
}

在我更正这部分代码后,错误已经消失,但现在 getData() 返回 null 而不是 value:

Data getData () {
  Data data;
  fetch().then((value) {data = value;});
  return data; //null
}

谢谢

【问题讨论】:

  • date = fetch().then(...) 表示您正在尝试将Future.then() 返回的Future 分配给data。您已经在.then 回调中分配了data = value,因此外部分配没有意义并且是不必要的。去掉它。更好的是,只需使用asyncawait,它会更清晰。
  • 谢谢,我没注意到。但我仍然很好奇是否有可能以某种方式从未来提取数据。我的意思是void GetData () =&gt; futureFunc().then((value) =&gt; data = value));
  • 我不明白你的意思。应该没有什么能阻止你这样做。

标签: flutter dart asynchronous future


【解决方案1】:

您可以将getData 设为异步函数,并使用await 关键字。如果您是异步编程新手和Futures

,则更容易理解
Future<Data> getData () async {
    final data = await fetch();
    // Whatever you want to do with data
    return data; // Dont forget to return it back to the caller
  }

【讨论】:

  • 谢谢,但这不是我想要的,因为现在getData() 返回“_Future”,但我希望它返回“Data”
  • 不幸的是,这是不可能的。如果您的函数依赖于来自异步操作的数据,则它必须返回 Future 类型。这是因为,当你的函数返回时,异步操作还没有完成,你需要的结果还不能返回给调用者。您必须改为返回 Future
【解决方案2】:

data 定义为Data 对象,而fetch() 返回Future&lt;Data&gt;,导致错误。

Data data;
  data = fetch().then((value) {
    data = value;
  }); 

您不能在不等待的情况下将Future 对象转换为同步对象。您可以在 UI 中执行此操作以获取 Future 值:

FutureBuilder<Data>(
  future: Fetch().fetch(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) return Container();
    Data data = snapshot.data;
    return Text(data);
  },
)

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2020-12-13
    • 2021-08-28
    • 2022-11-28
    • 2020-06-01
    • 1970-01-01
    相关资源
    最近更新 更多