我正在尝试使用 url 和 Image.network()
从 firebase 存储中提取图像。
但不知何故我卡住了。
我使用了 firebase 存储文档中的这个例子:
Future downloadURLExample() async {
String downloadURL = await firebase_storage.FirebaseStorage.instance
.ref('users/123/avatar.jpg')
.getDownloadURL();
// Within your widgets:
// Image.network(downloadURL);
return downloadURL;
}
但我不知道如何将这个 String downloadURL 放入我的容器和 Image.network。
我尝试这样做:
Container(
width: 200,
height: 200,
child: Image.network(downloadURL),
),
但它不起作用。我错过了什么?
答案 0 :(得分:0)
// use firebase package as fb
import 'package:firebase/firebase.dart' as fb;
import 'package:flutter/material.dart';
class Example extends StatefulWidget {
const Example({Key key}) : super(key: key);
@override
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
//variable for the called photo uri
Uri img;
//
downloadURLExample() {
fb
.storage()
.refFromURL(
'gs://******.appspot.com/users/123/avatar.jpg')
.getDownloadURL()
.then((value) => setState(() => img = value));
}
@override
void initState() {
//initialize method
downloadURLExample();
super.initState();
}
@override
Widget build(BuildContext context) {
return img == null
? CircularProgressIndicator()
: Container(
width: 200,
height: 200,
child: Image.network(img.toString()),
);
}
}
答案 1 :(得分:0)
问题在于您试图获取不在构建方法的 scope 中的 downloadURL
。您需要从 downloadURLExample
方法中获取下载 URL。
这是一个使用 FutureBuilder 的示例。
class MyStatefulWidget extends StatefulWidget {
const MyStatefulWidget({Key key}) : super(key: key);
@override
State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
Future<String> _downloadURLFuture;
@override
void initState() {
super.initState();
_downloadURLFuture = downloadURLExample();
}
Future<String> downloadURLExample() async {
String downloadURL = await firebase_storage.FirebaseStorage.instance.ref('users/123/avatar.jpg').getDownloadURL();
return downloadURL;
}
@override
Widget build(BuildContext context) {
return FutureBuilder<String>(
future: _downloadURLFuture,
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if (snapshot.hasData) {
final String downloadURL = snapshot.data;
return Image.network(
downloadURL,
loadingBuilder: (BuildContext context, Widget child, ImageChunkEvent loadingProgress) {
return Center(
child: CircularProgressIndicator(),
);
},
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
},
);
}
}