Bill_The_Coder
Bill_The_Coder

Reputation: 2500

How to save multiple images to firebase storage and get image urls at once?

I'm trying to save multiple images from a list to firebasestorage and get back references of all these images and then saving it to cloud firestore !

This list is List<menu> menus = []; here.

Multiple objects including paths of images only from phone are being saved from UI in this list(menus) and then I'm uploading images using these paths to firestorage and getting back its references to save it in firestore:

onPressed: () async {
                  for (var i; i <= menus.length; i++) {
                    Reference ref = storage.ref().child(
                        "${this.widget.rr.name}'s ${menus[i].itemName} Price ${menus[i].itemPrice}" +
                            DateTime.now().toString());
                    if (menus[i].imageFile.toString() == '') {
                      //Some code
                    } else {
                      UploadTask uploadTask = ref.putFile(menus[i].imageFile);
                      uploadTask.then((res) async {
                        menus[i].imageUrl = await res.ref.getDownloadURL();
                      });
                    }
                  }
                  await addUser();
                },

This is addUser() function:

Future<void> addUser() {
    return users
        .add({
      'name': this.widget.rr.name,
      'email': this.widget.rr.email,
      'password': this.widget.rr.password,
      'logoUrl': this.widget.rr.logo,
      'categories': this.widget.rr.categories,
      'menu': menus.map((i) => i.toMap()).toList(),
    })
        .then((value) => print("User Added"))
        .catchError((error) => print("Failed to add user: $error"));
  }

And this is Model class

class menu{
  int id;
  String itemName;
  String itemPrice;
  String itemDescription;
  File imageFile;
  String imageUrl;
  menu(this.id,this.itemName,this.itemPrice,this.itemDescription,this.imageFile,{this.imageUrl});
  Map<String, dynamic> toMap() {
    return {
      'id': this.id,
      'itemName': this.itemName,
      'itemPrice': this.itemPrice,
      'itemDesc': this.itemDescription,
      'imageUrl':this.imageUrl,
    };
  }

}

But when the button is pressed, following error is displayed...

E/flutter (12025): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The method '<=' was called on null.
E/flutter (12025): Receiver: null
E/flutter (12025): Tried calling: <=(2)
E/flutter (12025): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
E/flutter (12025): #1      _addMenuState.build.<anonymous closure> (package:ad_tello/UI/Restaurants/addMenu.dart:418:33)
E/flutter (12025): #2      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:993:19)
E/flutter (12025): #3      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1111:38)
E/flutter (12025): #4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:183:24)
E/flutter (12025): #5      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:598:11)
E/flutter (12025): #6      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:287:5)
E/flutter (12025): #7      BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:259:7)
E/flutter (12025): #8      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:157:27)
E/flutter (12025): #9      GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:362:20)
E/flutter (12025): #10     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:338:22)
E/flutter (12025): #11     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:267:11)
E/flutter (12025): #12     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:295:7)
E/flutter (12025): #13     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:240:7)
E/flutter (12025): #14     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:213:7)
E/flutter (12025): #15     _rootRunUnary (dart:async/zone.dart:1206:13)
E/flutter (12025): #16     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (12025): #17     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (12025): #18     _invoke1 (dart:ui/hooks.dart:265:10)
E/flutter (12025): #19     _dispatchPointerDataPacket (dart:ui/hooks.dart:174:5)
E/flutter (12025): 

Help please!

Upvotes: 0

Views: 228

Answers (1)

Peter Haddad
Peter Haddad

Reputation: 80904

You have to initialize i:

 for (var i = 0; i < menus.length; i++) {

Upvotes: 1

Related Questions