如何修复类型'Future <dynamic>'不是'String'类型的子类型Flutter

时间:2019-03-13 20:40:08

标签: dart flutter

扑扑初学者在这里;我收到此错误:type 'Future<dynamic>' is not a subtype of type 'String'

从Firebase存储中获取下载网址的功能

_getImageUrl(var fileName) async {
  print(fileName);
  final StorageReference ref = FirebaseStorage.instance.ref().child('categories/' + fileName);
  Uri downloadUrl = await ref.getDownloadURL();
  var url = downloadUrl.toString();
  return url;
}

我在其中调用函数的地方

child:  Image(
  image:  AdvancedNetworkImage(
    _getImageUrl(menuItem['image'].toString()),
    timeoutDuration: Duration(minutes: 1),
    useDiskCache: true,
    cacheRule: CacheRule(maxAge: const Duration(days: 7)),
  ),
  height: mediaQuery.size.width * 0.22,
  width: mediaQuery.size.width * 0.22,
),

3 个答案:

答案 0 :(得分:2)

首先,当Future<type>函数未完成时,Flutter返回一个asynchronous,当它完成时,它将返回type类型的数据。您所犯的错误是从asynchronous函数调用synchronous。尽管dart将执行asynchronously函数(您可以通过打印asynchronous函数的url来验证它)。
但是,您从那里调用它的地方并不是在等待{{1 }}函数完成。
我希望现在已经清楚了。
为了更清晰起见,请访问 Asynchronous Programming

答案 1 :(得分:0)

async/await方法(或build闭包)返回时,不能使用builder。在构建窗口小部件树时,只要您异步,最好使用FutureBuilder

child: FutureBuilder<String>(
  future: _getImageUrl(menuItem['image'].toString()),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Image(
        image: AdvancedNetworkImage(
          snapshot.data,
          timeoutDuration: Duration(minutes: 1),
          useDiskCache: true,
          cacheRule: CacheRule(maxAge: const Duration(days: 7)),
        ),
        height: mediaQuery.size.width * 0.22,
        width: mediaQuery.size.width * 0.22,
      );
    }
    return CircularProgressIndicator();
  }
),

或者,您可以 为此使用StatefulWidget,但这要样板很多。如果您有兴趣,可以在https://flutterigniter.com/build-widget-with-async-method-call/上找到更多详细信息和实时示例。

答案 2 :(得分:-1)

您的_getImageUrl应该返回Future<String>