扑扑初学者在这里;我收到此错误: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,
),
答案 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>
。