Flutter:函数返回空值

d6kp6zgx  于 2023-02-09  发布在  Flutter
关注(0)|答案(2)|浏览(307)

编译flutter代码时遇到了问题,它抛出了以下错误:
生成FutureBuilder(脏,状态:_未来构建器状态#afa3f):生成函数返回null。
违规的小部件是:FutureBuilder生成函数决不能返回空值。
若要返回使构建小部件填满可用空间的空白空间,请返回"Container()"。若要返回占用尽可能少空间的空白空间,请返回"Container(width:0.0,高度:0.0)"。
代码如下:

home: Builder(builder: (context) {
              return FutureBuilder(
                future: DeeplinkConfig().initUniLinks(context),
                builder: (_, snapshot) {
                  if (snapshot.connectionState == ConnectionState.waiting) {
                    return Container(width: 0.0, height: 0.0);
                  }
                  return snapshot.data as Widget;
                },
              );
            }),

请,如果有人解释错误,并告诉我如何修复它,我将不胜感激。

5sxhfpxr

5sxhfpxr1#

此错误消息表示FutureBuilder的构建器回调返回null作为要显示的小部件。
构建器回调应返回一个非空的小部件以显示在FutureBuilder中。您可以返回一个宽度和高度为0.0的小部件,也可以返回一个指示数据正在加载的小部件,如CircularProgressIndicator。
我推荐一个FutureBuilder,它在未来等待的时候返回一个CircularProgressIndicator:

return FutureBuilder(
  future: DeeplinkConfig().initUniLinks(context),
  builder: (_, snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return CircularProgressIndicator();
    }
    return snapshot.data as Widget;
  },
);
sqxo8psd

sqxo8psd2#

问题出在这一行:

return snapshot.data as Widget;

你的Future脱离了等待状态,但是data仍然为null,然后你将它强制转换为Widget,这样就绕过了Dart的类型检查,允许代码编译,但是在运行时中断。
你可以将snapshot.data赋给一个局部变量,并检查它是否为空,这将允许Dart的类型提升生效,并且你可以在检查通过后直接返回局部变量,而不需要任何强制转换:

return FutureBuilder<Widget>(
  future: DeeplinkConfig().initUniLinks(context),
  builder: (_, snapshot) {
    final data = snapshot.data;
    snapshot.connectionState
    if (snapshot.connectionState == ConnectionState.waiting || data == null) {
      return Container(width: 0.0, height: 0.0);
    }
    return data;
  },
);

这是假设

  1. future在完成时总是返回一个非空结果,并且
    1.该返回值是一个小部件

相关问题