dart - Future 结合 Flutter 中的 FutureBuilder 返回 null

标签 dart flutter

我想使用 FutureBuilder 检查 url 是否为 png 图像,然后构建一个或两个图像(在列表中)。但是不知何故,当我打印它时,Future 总是返回 null ...

结果是应用程序始终使用两个 CachedNetworkImages 构建 ListView ,这不是我想要的。如果 URL 是图像,它应该只使用该 url 构建一个 CachedNetworkImage,如果不是,它应该更改 url 并构建一个包含 2 个图像的 ListView 。

child: new FutureBuilder(
                future: _getImages(widget.imgUrl),
                builder: (BuildContext context, AsyncSnapshot snapshot) {
                  switch (snapshot.connectionState) {
                    case ConnectionState.none:
                      return new Text('Press button to start');
                    case ConnectionState.waiting:
                      return new Text('Awaiting result...');
                    default:
                      if (snapshot.hasError)
                        return new Text('Error: ${snapshot.error}');
                      else {
                        print(snapshot.data);
                        if (snapshot.data == "image/png") {
                          return new SingleChildScrollView(
                            child: new CachedNetworkImage(
                              imageUrl: widget.imgUrl,
                              placeholder: new Center(
                                  child: new AdaptiveProgressIndicator()),
                            ),
                          );
                        } else {
                          return new ListView(
                            children: <Widget>[
                              new CachedNetworkImage(
                                imageUrl:
                                    widget.imgUrl.split('.png')[0] + '-0.png',
                                placeholder: new Center(
                                    child: new AdaptiveProgressIndicator()),
                              ),
                              new CachedNetworkImage(
                                imageUrl:
                                    widget.imgUrl.split('.png')[0] + '-1.png',
                              )
                            ],
                          );
                        }
                      }
                  }
                }),
          ),
        ));
  }

  Future<String> _getImages(String url) async {
    await http.get(url).then((result) {
      return result.headers['content-type'];
    });
  }

最佳答案

这段代码有点奇怪。

Future<String> _getImages(String url) async {
  await http.get(url).then((result) {
    return result.headers['content-type'];
  });
}

async 允许您避免 then(在大多数情况下)。

代码应该是:

Future<String> _getImages(String url) async {
  var result = await http.get(url);
  // for debugging only
  print('statusCode: ${result.statusCode}');
  var contentType = result.headers['content-type'];
  print('content-type: $contentType');
  return contentType;
}

通过这种方式,您还可以检查请求是否实际提供了结果。

关于dart - Future 结合 Flutter 中的 FutureBuilder 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802315/

相关文章:

android - 创建 ClipPath Flutter 时出现错误 "Each child must be laid out exactly once"

ios - SocketException(SocketException : Failed host lookup: 'test' (OS Error: nodename nor servname provided, 或未知,errno = 8))

android-studio - flutter 医生找不到android studio

networking - 如何在flutter应用程序上计算/获取用户互联网带宽速度

flutter - 如何在 Flutter/Dart 中处理应用程序卸载?

flutter - Flutter/Dart Const 构造函数中的常量值无效

flutter - Flutter ReorderableListView 中的 onReorder() 参数

flutter - 抖动的边界生命周期

FlutterError(在初始化绑定(bind)之前访问了ServicesBinding.defaultBinaryMessenger

flutter - Boxshadow 出现在其他小部件后面