Сохранить Url картинки в Firestore

Не получается сохранить Url картинки в Firestore, документ создается, картинка сохраняется в Storage все работает. Может проблема в последовательности?

    class ProductService {
  Firestore _firestore = Firestore.instance;

  void createProduct(_nameproductController, _priceproductController,
      _currentCategory, url) async {

    _firestore.collection("products").document().setData({
      'name': _nameproductController,
      'price': _priceproductController,
      'category': _currentCategory,
      'image': url,
    });
  }
}

storage

    void uploadImg() async {
var timekey = DateTime.now();
fb.StorageReference storageReference =
    fb.storage().ref('imgProduct/${timekey.toString()}.jpg');
fb.UploadTaskSnapshot uploadTask = await storageReference
    .put(_image1, fb.UploadMetadata(contentType: 'image/jpg'))
    .future;

var imageUrl = await uploadTask.ref.getDownloadURL();

url = imageUrl.toString();
print('Image Url' + url);}

submit button

RaisedButton(
   onPressed: () async {
     if (_formKeyProduct.currentState.validate()) {
        uploadImg();
        ProductService().addProduct(
         _nameproductController.text,
         _priceproductController.text,
         _currentCategory.categoryname.toString(),
         url,
        );

        _formKeyProduct.currentState.reset();
        _nameproductController.clear();
        _priceproductController.clear();
     }

     setState(() {
        _currentCategory = null;
     });
  },

Ответы (1 шт):

Автор решения: MiT

Ради интереса сделайте отладку кода, а именно метода uploadImg() по каждой строчке.


Проблема в методе void uploadImg() async {...}, потому что он ничего не возвращает и скорее всего не успевает присваивать переменную url = imageUrl.toString(); из-за асинхронности. Я вам специально в прошлый раз сделал чтобы метод возвращал файл, чтобы можно было его использовать примерно так:

url = await uploadImg();

// или так

_firestore.collection("products").document().setData({
  'name': _nameproductController,
  'price': _priceproductController,
  'category': _currentCategory,
  'image': await uploadImg(),
});
→ Ссылка