我已成功使用 multi_image_picker 获取多个图像,但未能将图像上传到 Firebase 存储。我请求有关将图像保存到 firebase 存储并返回 url 的帮助。
我已经在下面发布了我的代码,谢谢。
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/services.dart';
import 'package:multi_image_picker/multi_image_picker.dart';
import 'package:mock_data/mock_data.dart';
class PageTwo extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<PageTwo> {
List<Asset> images = List<Asset>();
String popop = mockString(50);
@override
void initState() {
super.initState();
}
Widget buildGridView() {
return GridView.count(
crossAxisCount: 3,
children: List.generate(images.length, (index) {
Asset asset = images[index];
return AssetThumb(
asset: asset,
width: 300,
height: 300,
);
}),
);
}
Future saveImage(Asset asset) async {
String fileName = popop;
ByteData byteData = await asset.requestOriginal();
List<int> imageData = byteData.buffer.asUint8List();
StorageReference ref = FirebaseStorage.instance.ref().child(fileName);
StorageUploadTask uploadTask = ref.putData(imageData);
return await (await uploadTask.onComplete).ref.getDownloadURL();
}
Future<void> loadAssets() async {
List<Asset> resultList = List<Asset>();
try {
resultList = await MultiImagePicker.pickImages(
maxImages: 300,
enableCamera: true,
selectedAssets: images,
cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"),
materialOptions: MaterialOptions(
actionBarColor: "#abcdef",
actionBarTitle: "Example App",
allViewTitle: "All Photos",
selectCircleStrokeColor: "#000000",
));
}
}
if (!mounted) return;
setState(() {
images = resultList;
_error = error;
});
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: const Text('Getting pics'),
),
body: Column(
children: <Widget>[
RaisedButton(
child: Text("Pick images"),
onPressed: loadAssets,
),
RaisedButton(
child: Text("Save Image"),
onPressed: () => saveImage,
),
Expanded(
child: buildGridView(),
)
],
),
),
);
}
}
最佳答案
看起来您实际上并没有对该 URL 执行任何操作。 saveFile 上的 Future 不会返回任何内容,也不会将结果放在任何地方。
await (await uploadTask.onComplete).ref.getDownloadURL()
另外,等待等待看起来有点奇怪。您可能可以通过简单地级联 onComplete 等待来逃脱。我不完全确定但值得一试。
await uploadTask.onComplete..ref.getDownloadURL()
此外,当我使用 StorageUploadTask 时,我通常会监听任务来获取上传进度,然后添加 onComplete 部分来获取 downloadURL。
关于firebase - Flutter无法上传从multi_image_picker获取的多张图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56345247/