import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:uuid/uuid.dart'; import 'dart:async'; import 'main.dart'; import 'dart:io'; import 'package:image/image.dart' as Im; import 'package:path_provider/path_provider.dart'; import 'dart:math' as Math; class Uploader extends StatefulWidget { _Uploader createState() => new _Uploader(); } class _Uploader extends State { File file; TextEditingController descriptionController = new TextEditingController(); bool uploading = false; bool promted = false; @override initState() { if (file == null && promted == false && pageController.page == 2) { _selectImage(); setState(() { promted = true; }); } super.initState(); } Widget build(BuildContext context) { return file == null ? new IconButton( icon: new Icon(Icons.file_upload), onPressed: _selectImage) : new Scaffold( resizeToAvoidBottomPadding: false, appBar: new AppBar( backgroundColor: Colors.white70, leading: new IconButton( icon: new Icon(Icons.arrow_back, color: Colors.black), onPressed: clearImage), title: const Text( 'Post to', style: const TextStyle(color: Colors.black), ), actions: [ new FlatButton( onPressed: postImage, child: new Text( "Post", style: new TextStyle( color: Colors.blueAccent, fontWeight: FontWeight.bold, fontSize: 20.0), )) ], ), body: new Column( children: [ new PostForm( imageFile: file, descriptionController: descriptionController, loading: uploading, ), ], )); } _selectImage() async { return showDialog( context: context, barrierDismissible: false, // user must tap button! child: new SimpleDialog( title: const Text('Create a Post'), children: [ new SimpleDialogOption( child: const Text('Take a photo'), onPressed: () async { Navigator.pop(context); File imageFile = await ImagePicker.pickImage(source: ImageSource.camera); setState(() { file = imageFile; }); }), new SimpleDialogOption( child: const Text('Choose from Gallery'), onPressed: () async { Navigator.of(context).pop(); File imageFile = await ImagePicker.pickImage(source: ImageSource.gallery); setState(() { file = imageFile; }); }), new SimpleDialogOption( child: const Text("Cancel"), onPressed: () { Navigator.pop(context); }, ) ], )); } void compressImage() async { print('startin'); final tempDir = await getTemporaryDirectory(); final path = tempDir.path; int rand = new Math.Random().nextInt(10000); Im.Image image = Im.decodeImage(file.readAsBytesSync()); Im.Image s = Im.copyResize(image, 500); // image.format = Im.Image.RGBA; // Im.Image newim = Im.remapColors(image, alpha: Im.LUMINANCE); var newim2 = new File('$path/img_$rand.jpg') ..writeAsBytesSync(Im.encodeJpg(image, quality: 85)); setState(() { file = newim2; }); print('done'); } void clearImage() { setState(() { file = null; }); } void postImage() { setState(() { uploading = true; }); compressImage(); Future upload = uploadImage(file).then((String data) { postToFireStore(mediaUrl: data, description: descriptionController.text); }).then((_) { setState(() { file = null; uploading = false; }); }); } } class PostForm extends StatelessWidget { var imageFile; TextEditingController descriptionController; bool loading; PostForm({this.imageFile, this.descriptionController, this.loading}); Widget build(BuildContext context) { return new Column( children: [ loading ? new LinearProgressIndicator() : new Padding(padding: new EdgeInsets.only(top: 0.0)), new Container( child: new Image.file( imageFile, fit: BoxFit.fitWidth, )), new Divider(), new Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ new CircleAvatar( child: new Text("d"), ), new Container( width: 250.0, child: new TextField( controller: descriptionController, decoration: new InputDecoration( hintText: "Write a caption...", border: InputBorder.none), ), ), ], ), new Divider() ], ); } } Future uploadImage(var imageFile) async { var uuid = new Uuid().v1(); StorageReference ref = FirebaseStorage.instance.ref().child("post_$uuid.jpg"); StorageUploadTask uploadTask = ref.put(imageFile); Uri downloadUrl = (await uploadTask.future).downloadUrl; return downloadUrl.toString(); } void postToFireStore( {String mediaUrl, String location, String description}) async { var reference = Firestore.instance.collection('insta_posts'); reference.add({ "username": "testeronslice", "location": "nice location", "likes": {}, "mediaUrl": mediaUrl, "description": description, "ownerId": googleSignIn.currentUser.id, "timestamp": new DateTime.now().toString() }); }