在 Flutter 的 FutureBuilder 中检查 `snapshot.hasData` 和 `snapshot.data != null` 是否多余?

Men*_*elG 3 future dart flutter flutter-futurebuilder

我正在使用 Flutter FutureBuilder,并发现了一种模式, 渲染小部件之前检查 和snapshot.hasData snapshot.data != null

FutureBuilder(
  future: future,
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    if (snapshot.hasData && snapshot.data != null) {
      return widgetToBuild;
    } else if (snapshot.hasError) {
      return Icon(Icons.error_outline);
    } else {
      return CircularProgressIndicator();
    }
  }
)
Run Code Online (Sandbox Code Playgroud)

在检查 的源代码后AsyncSnapshot,我注意到hasData定义trueif datais not null

bool get hasData => data != null;
Run Code Online (Sandbox Code Playgroud)

snapshot.hasData鉴于此实现,检查和是否多余snapshot.data != null?还不够snapshot.hasData,因为它本质上检查是否data不是null

我很好奇是否存在两种检查都可能是必要的情况,或者这是否只是FutureBuilder开发人员在使用中经常错误的常见误解。

Von*_*onC 5

来自AsyncSnapshot#hasData()提交fbd4bb9

在第 34545 期中,围绕这个问题展开了一场激烈的争论:

如果我们停止将data == null初始数据与此讨论完全混为一谈,而只是进行一个小的突破性更改,即在 hasError 为 true 时使数据获取器抛出异常,会怎么样?
我也会摆脱requireData并让调用者自己检查 null。

这对我来说确实听起来不错 - 但有一个不便:data == null初始数据的合并有点融入到hasDatagetter 中的 API 中(它只是检查数据是否为 ​​null,但 null 可能是有效数据......)。我想知道我们是否也
应该摆脱并告诉人们如果你想知道数据是否不为空,只需检查数据?hasData

我怀疑这就是为什么您会看到如下代码:

FutureBuilder(
  future: future,
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    if (snapshot.hasData) {
      if (snapshot.data != null) {
        return widgetToBuild; // Data is available and not null
      } else {
        // Handle null data scenario, e.g., show a message
        return Text("No data available");
      }
    } else if (snapshot.hasError) {
      return Icon(Icons.error_outline); // An error occurred
    }
    return CircularProgressIndicator(); // Still waiting for data
  }
)
Run Code Online (Sandbox Code Playgroud)

但在目前的状态下,它仍然是多余的。