【发布时间】:2021-05-13 07:04:39
【问题描述】:
我正在尝试将 Flutter Web 应用程序中的图像上传到 Firestore。完整的程序如下,但不工作。显示的错误是 NoSuchMethodError: Method not found: 'buffer' on null。 ImagePickerWeb 不返回完整路径,因此无法使用 putFile()。任何建议如何解决这个问题?谢谢!
import 'package:flutter/material.dart';
import 'values.dart';
import 'package:image_picker_web/image_picker_web.dart';
import 'dart:async';
import 'dart:ui' as ui;
import 'package:firebase_storage/firebase_storage.dart';
import 'dart:typed_data';
class MyHome extends StatefulWidget {
@override
_MyHomeState createState() => _MyHomeState();
}
class _MyHomeState extends State<MyHome> {
Image pickedImage;
int width, height;
ByteData ImageData;
String errormsg = 'none';
@override
void initState() {
super.initState();
}
pickImage() async {
/// You can set the parameter asUint8List to true
/// to get only the bytes from the image
/* Uint8List bytesFromPicker =
await ImagePickerWeb.getImage(outputType: ImageType.bytes);
if (bytesFromPicker != null) {
debugPrint(bytesFromPicker.toString());
} */
/// Default behavior would be getting the Image.memory
Image fromPicker = await ImagePickerWeb.getImage(outputType: ImageType.widget);
Completer<ui.Image> completer = new Completer<ui.Image>();
fromPicker.image
.resolve(new ImageConfiguration())
.addListener(new ImageStreamListener((ImageInfo image, bool _) {
completer.complete(image.image);
}));
ui.Image info = await completer.future;
ImageData = await info.toByteData(format: ui.ImageByteFormat.png);
width = info.width;
height = info.height;
if (fromPicker != null) {
setState(() {
pickedImage = fromPicker;
});
}
}
uploadPhoto () async {
final storage = FirebaseStorage.instance;
bool hasError;
String imageURL;
errormsg = 'start';
if (pickedImage != null) {
try {
StorageReference firebaseStorageRef = await storage.ref().child(pickedImage.semanticLabel);
StorageUploadTask uploadTask = firebaseStorageRef.putData(ImageData.buffer.asUint8List());
StorageTaskSnapshot taskSnapshot = await uploadTask.onComplete;
imageURL = await taskSnapshot.ref.getDownloadURL();
}
catch (error) {
hasError = true;
errormsg = error.toString();
}
}
setState(() {
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Image Picker Web Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
AnimatedSwitcher(
duration: Duration(milliseconds: 300),
switchInCurve: Curves.easeIn,
child: SizedBox(
width: 200,
child: pickedImage,
) ??
Container(),
),
SizedBox(
width: 15,
),
],
),
(pickedImage != null) ? Text('$width x $height') : Text('0 x 0'),
ButtonBar(alignment: MainAxisAlignment.center, children: <Widget>[
RaisedButton(
onPressed: () => pickImage(),
child: Text('Select Image'),
),
RaisedButton(
onPressed: () => uploadPhoto(),
child: Text('Upload photo'),
),
]),
Text('Error: ' + errormsg),
])),
),
);
}
}
【问题讨论】:
标签: image flutter google-cloud-firestore upload