为什么 snapshot.data 在 FutureBuilder 中返回 null?

时间:2021-05-29 10:51:25

标签: flutter dart dart-null-safety

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?,为什么会这样?

2 个答案:

答案 0 :(得分:2)

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

T? get data;

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

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

答案 1 :(得分:1)

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