【问题标题】:Why snapshot.data returns null in FutureBuilder?为什么 snapshot.data 在 FutureBuilder 中返回 null?
【发布时间】:2021-05-29 10:51:25
【问题描述】:
void main() {
  FutureBuilder<bool>(
    future: f(),
    builder: (_, AsyncSnapshot<bool> snapshot) {
      bool data = snapshot.data; // Error
      return Container();
    },
  );
}

Future<bool> f() async => true;

我在所有地方都使用了bool,因此我的snapshot.data 也应该返回bool,但它返回bool?,为什么会这样?

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

    如果你看到数据的实现,那就是:

    T? get data;
    

    数据返回类型为T? 而不是T 的原因是错误。如果您的Future 返回错误怎么办,在这种情况下您会收到一个空值。你应该这样使用它:

    FutureBuilder<bool>(
      future: f(),
      builder: (_, AsyncSnapshot<bool> snapshot) {
        if (!snapshot.hasError) {
          bool data = snapshot.data!;
        }
        return Container();
      },
    )
    

    【讨论】:

    • 除了if (!snapshot.hasError),你也可以使用if (snapshot.hasData)
    • 你刚刚放了!在条件之后,就像这个 snapshot.data!
    【解决方案2】:

    那是因为data 的签名是final T? data,见https://api.flutter.dev/flutter/widgets/AsyncSnapshot/data.html 这是有道理的,因为当你的异步计算还没有产生结果,或者发生错误时没有数据可以返回。

    【讨论】:

    • 其实间接的问题是为什么是T? get data而不是T get data
    猜你喜欢
    • 2019-05-31
    • 2021-10-08
    • 2021-08-29
    • 2021-10-08
    • 1970-01-01
    • 2020-07-10
    • 2021-11-27
    • 2022-12-26
    • 1970-01-01
    相关资源
    最近更新 更多