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

Abd*_*ani 6 dart flutter

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

从 Firebase 存储中获取下载 url 的函数

_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;
}
Run Code Online (Sandbox Code Playgroud)

我调用函数的地方

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,
),
Run Code Online (Sandbox Code Playgroud)

fra*_*k06 9

async/awaitbuild方法(或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();
  }
),
Run Code Online (Sandbox Code Playgroud)

或者,您可以StatefulWidget为此使用 a ,但它更像样板。如果您有兴趣,可以访问https://flutterigniter.com/build-widget-with-async-method-call/了解更多详细信息和实时示例。


Mra*_*dar 8

Flutter 首先Future<type>asynchronous函数未完成时返回 a ,完成时返回类型为 的数据type。您犯的错误是asynchronoussynchronous函数调用 a 。虽然 dart 会执行函数asynchronously(您可以通过从asynchronous函数打印 url 来验证这一点)。
但是你调用它的地方不是在等待asynchronous函数完成。
我希望现在清楚了。
为了更清楚,请访问异步编程


Rub*_*elo -6

_getImageUrl应该返回一个Future<String>.

  • 在调用此函数之前使用“await” (2认同)