我想将照片添加到firestore.你能告诉我怎么做吗?
我正在使用图像选择器在我的颤动应用程序中选择照片.
我的代码如下
import 'package:flutter/material.dart'; import 'package:onlinecity/component/TextField/inputField.dart'; import 'package:onlinecity/component/Button/roundedButton.dart'; import 'package:onlinecity/component/Button/textButton.dart'; import 'style.dart'; import 'package:onlinecity/theme/style.dart'; import 'package:flutter/services.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:image_picker/image_picker.dart'; import 'dart:async'; import 'dart:io'; class AddOfferScreen extends StatefulWidget { @override AddOfferScreenState createState() => new AddOfferScreenState(); } class AddOfferScreenState extends State<AddOfferScreen> { final GlobalKey<FormState> _formKey = new GlobalKey<FormState>(); final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); bool _autovalidate = false; String _productTitle; String _category; String _contactNumber; Future<File> _imageFile; void _onImageButtonPressed(ImageSource source) { setState(() { _imageFile = ImagePicker.pickImage(source: source); }); } _onPressed() { print("button clicked"); } void showInSnackBar(String value) { _scaffoldKey.currentState .showSnackBar(new SnackBar(content: new Text(value))); } bool _handleSubmitted() { final FormState form = _formKey.currentState; if (form.validate()) { form.save(); return true; } return false; } void validateAndSubmit() async{ if (_handleSubmitted()){ try { Firestore.instance.collection('todos').document().setData({"productTitle":_productTitle,"category":_category,"contactNumber":_contactNumber}); } catch (e){ print('Error: $e'); } } } void _showaddphoto(){ AlertDialog dialog = new AlertDialog( actions: <Widget>[ new IconButton(icon: new Icon(Icons.camera_alt),onPressed: () => _onImageButtonPressed(ImageSource.camera),tooltip: 'Take a Photo'),new IconButton(icon: new Icon(Icons.sd_storage),onPressed: () => _onImageButtonPressed(ImageSource.gallery),tooltip: 'Pick Image from gallery') ],); showDialog(context: context,child: dialog); } @override Widget build(BuildContext context) { // TODO: implement build Size screenSize = MediaQuery.of(context).size; //print(context.widget.toString()); return new Scaffold( key: _scaffoldKey,body: new SingleChildScrollView( child: new Container( padding: new EdgeInsets.all(16.0),decoration: new BoxDecoration(image: backgroundImage),child: new Column( mainAxisAlignment: MainAxisAlignment.end,crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[ new SizedBox( height: screenSize.height / 2 + 20,child: new Column( mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[ new Text( "CREATE ACCOUNT",textAlign: TextAlign.center,style: headingStyle,) ],)),new Column( children: <Widget>[ new Form( key: _formKey,autovalidate: _autovalidate,//onWillPop: _warnUserAboutInvalidData,child: new Column( children: <Widget>[ new FutureBuilder<File>( future: _imageFile,builder: (BuildContext context,AsyncSnapshot<File> snapshot) { if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) { return new Image.file(snapshot.data); } else if (snapshot.error != null) { return const Text('error picking image.'); } else { return const Text('You have not yet picked an image.'); } },),new RaisedButton.icon(onPressed: _showaddphoto,icon: new Icon(Icons.add_a_photo),label: new Text('Add Photo')),new InputField( hintText: "product title",obscureText: false,textInputType: TextInputType.text,textStyle: textStyle,textFieldColor: textFieldColor,icon: Icons.person_outline,iconColor: Colors.white,bottomMargin: 20.0,validateFunction: (value)=> value.isEmpty ? 'UserName can\'t be empty' : null,onSaved: (value)=> _productTitle = value,new InputField( hintText: "Category",textInputType: TextInputType.emailAddress,icon: Icons.mail_outline,validateFunction: (value)=> value.isEmpty ? 'Email can\'t be empty' : null,onSaved: (value)=> _category = value,new InputField( hintText: "Contact Number",obscureText: true,icon: Icons.lock_open,bottomMargin: 40.0,validateFunction: (value)=> value.isEmpty ? 'Contact number can\'t be empty' : null,onSaved: (value)=> _contactNumber = value,new RoundedButton( buttonName: "Continue",onTap: validateAndSubmit,width: screenSize.width,height: 50.0,bottomMargin: 10.0,borderWidth: 1.0) ],new TextButton( buttonName: "Terms & Condition",onPressed: _onPressed,buttonTextStyle: buttonTextStyle,) ],) ],)); } }
解决方法
import 'package:firebase_storage/firebase_storage.dart'; ///////// var fileName = "fileName.jpeg"; StorageUploadTask putFile = storage.ref().child("folder/$fileName").putFile(_image); putFile.future.catchError(onError); UploadTaskSnapshot uploadSnapshot = await putFile.future; print("image uploaded"); Map<String,dynamic> pictureData = new Map<String,dynamic>(); pictureData["url"] = uploadSnapshot.downloadUrl.toString(); DocumentReference collectionReference = Firestore.instance.collection("collection").document(fileName); await Firestore.instance.runTransaction((transaction) async { await transaction.set(collectionReference,pictureData); print("instance created"); }).catchError(onError);
在这里,这会将文件存储到存储中,然后将downloadUrl保存到您的集合中.而不是文档(fileName),您可以选择自己的文档ID.