0

I'm able to choose a list of images from Image Picker Web and display it on my app.

 Future _pickMultiImages() async {
    final images = await ImagePickerWeb.getMultiImagesAsWidget();

    _pickedImages.clear();
    if (images != null) _pickedImages.addAll(images);
    setState(() {
          _photo = _pickedImages;
    });

I am NOT able to upload the list of images (or as individual images) to Firebase Storage. There's always some kind of complete problem.

void UploadImage(List<Image> pickedImages) async {
  Directory appDocDir = await getApplicationDocumentsDirectory();
  String appDocPath = appDocDir.path;
  print(appDocPath);
  final filePath = "${appDocPath}/path/to/mountains.jpg";
  final file = File(filePath);

// Create the file metadata
  final metadata = SettableMetadata(contentType: "image/jpeg");

// Create a reference to the Firebase Storage bucket
  final storageRef = FirebaseStorage.instance.ref();

// Upload file and metadata to the path 'images/mountains.jpg'
  final uploadTask =
      storageRef.child("images/mountains.jpg").putFile(file, metadata);
}

I understand the above code isn't catered to my app yet and the reason is so you can see the default code. I don't get past appDocDir = await getApplicationDocumentsDirectory() I always get this:

void _complete() {
     assert(_completed == null);
     _completed = true;
     _primaryCompleter.complete();
     _secondaryCompleter?.complete();
}

CURRENT CODE THAT'S NOT WORKING TO DISPLAY IMAGE

import 'package:file_selector/file_selector.dart';
import 'package:flutter/material.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'dart:async';
import 'package:image_picker_web/image_picker_web.dart';

class UploadImageTest extends StatefulWidget {
  const UploadImageTest({Key? key}) : super(key: key);

  @override
  State<UploadImageTest> createState() => _UploadImageTestState();
}

class _UploadImageTestState extends State<UploadImageTest> {
  ///////////////// VARIABLES ////////////////////////////////////////////////////////////////////

  List<XFile> images = [];

  var _pickedImages;

  var _photo;

////////////////// IMAGE PICKING AND UPLOADING FUNCTIONS ////////////////////////////////////////

  Future _pickMultiImages() async {
    final images = await ImagePickerWeb.getMultiImagesAsBytes();

    _pickedImages.clear();
    if (images != null) _pickedImages.addAll(images);
    setState(() {
      _photo = _pickedImages;
    });
    print('pickMultiImages');
  }

  Future<List<XFile>?> _pickWebImages() async {
    final typeGroup = XTypeGroup(label: 'images', extensions: ['jpg', 'png']);
    final images = await openFiles(acceptedTypeGroups: [typeGroup]);

    if (images == null) return null;

    return images;
  }

  Future<void> uploadWebImages(List<XFile> images) async {
    // Create the file metadata
    final metadata = SettableMetadata(contentType: 'image/jpeg');

    // Create a reference to the Firebase Storage bucket
    final storageRef = FirebaseStorage.instance.ref('images');

    // Upload files and metadata to the bucket
    for (final image in images) {
      final data = await image.readAsBytes();
      final uploadTask = storageRef.child(image.name).putData(
            data,
            metadata,
          );

      await uploadTask;
    }
  }

////////////////////////////////////////////////////////////////////////////////////////////////////

  @override
  Widget build(BuildContext context) {
    return Material(
      child: Scaffold(
          body: SingleChildScrollView(
              child: Container(
                  child: Column(children: [
        Center(
          child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                Wrap(
                  // spacing: 15.0,
                  children: <Widget>[
                    AnimatedSwitcher(
                      duration: const Duration(milliseconds: 300),
                      switchInCurve: Curves.easeIn,
                      child: SizedBox(
                        width: 500,
                        height: 200,
                        child: ListView.builder(
                            scrollDirection: Axis.horizontal,
                            itemCount: 3,

                            /// length method not found
                            itemBuilder: (_, index) => _pickedImages[index]),
                      ),
                    ),
                  ],
                ),
                ButtonBar(
                    alignment: MainAxisAlignment.center,
                    children: <Widget>[
                      ElevatedButton(
                        onPressed: () {
                          _pickMultiImages();
                        },
                        child: const Text('Select Images'),
                      ),
                      ElevatedButton(
                        onPressed: () {
                          uploadWebImages(_pickedImages);
                        },
                        child: const Text('Upload Images'),
                      ),
                    ]),
              ]),
        ),
      ])))),
    );
  }
}

////////////////////////////////////////////////////////////////////////////////////////////////////
user40823
  • 111
  • 1
  • 2
  • 10

1 Answers1

0

I'm assuming that you are using the path_provider package. But this package isn't supported for web.

As an alternative, take a look at this StackOverflow post:

MendelG
  • 14,885
  • 4
  • 25
  • 52