So, I am trying to save an image file from the camera then upload it to firebase. Unfortunately, the firebase storage plugin has some errors and doesn't return errors in the catch so I need to check wifi connection before i do so, just in case i need to cache the image and upload it later. Once the image file has uploaded i then create some JSON and send that to firebase database where the app pulls down relevant information.

Note: sometimes this code works and the image is not empty, othertimes the image comesback empty so im guessing its a timing issue?

Future saveImageFile(UploadImage image) async {
  await storage.init();
  var imageFile = storage.saveImageFile(image.file, image.getName());
  instance.setInt("ImageCount", imageCount + 1);
  checkConnectionThenUploadImage(imageFile);
}

//From storage class
File saveImageFile(File toBeSaved, String fileName)  {
  final filePath = '$imageDirectory$fileName';
  var file = new File(filePath)
    ..createSync(recursive: true)
    ..writeAsBytes(toBeSaved.readAsBytesSync());
  return file;
}

checkConnectionThenUploadImage(File image) {
  checkConnectivity().then((isConnected) async {
    if (!isConnected) {
      instance.setBool("hasImagesToUpload", true);
    } else {
      await saveImageToStorage(image);
    }
  }).catchError((error) {
    print("Error getting connectivity status, was error: $error");
  });
}

saveImageToStorage(File imageFile) async {
  final fileName = getNameFromFile(imageFile);
  final StorageReference ref = FirebaseStorage.instance.ref().child("AllUsers").child(uuid).child(fileName);
  final StorageUploadTask uploadTask = ref.putFile(imageFile, const StorageMetadata(contentLanguage: "en"));
  final url = (await uploadTask.future).downloadUrl;

  if (url != null) {  //Normally you could catch an error here but the plugin has a bug so it needs to be checked in other ways
    final fireImage = new FireImage(getNameFromFile(imageFile), storage.getDateFromFileName(fileName), imageCount, "", url.toString());
    saveImageJsonToDatabase(fireImage);
    storage.deleteImageFile(fileName);
  } else {
    checkConnectionThenUploadImage(imageFile);
  }
}

saveImageJsonToDatabase(FireImage image) async {
  await storage.init();
  storage.saveJsonFile(image);
  checkConnectivity().then((isConnected) {
    if (!isConnected) {
      instance.setBool("hasJsonToUpload", true);
    } else {
      final DatabaseReference dataBaseReference = FirebaseDatabase.instance.reference().child("AllUsers").child(uuid);
      dataBaseReference.child("images").push().set(image.toJson()).whenComplete (() {
        storage.deleteJsonFile(basename(image.name));
      }).catchError((error) { //catching errors works with firebase database
        saveImageJsonToDatabase(image);
      });
    }
  });
}

//From storage class
deleteImageFile(String fileName) async {
  final filePath = '$imageDirectory$fileName';
  File(filePath).delete();
}

The image gets uploaded and the json is created but when i try to view the image using the download url from firebase storage it says the image is empty. The only clue i have is that this is a timing issue because it only happens occasionally.

Can anyone see where im going wrong?