Я работаю над приложением Flutter, подключенным к Firebase Cloud Firestore and Storage, и хочу создать в Cloud Firestore документы, содержащие URL-адрес загрузки файлов в хранилище. Однако мне также нужно, чтобы имя файла было уникальным идентификатором того же документа Firestore. Прямо сейчас я загружаю файл после создания документа, но впоследствии мне потребуется дополнительная запись для обновления документа Firestore.
Я хочу предотвратить это. Это могло бы сработать, если бы я мог получить доступ к идентификатору вновь созданного документа в функции add(), чтобы я мог передать его в storageTask, который вернет URL-адрес загрузки непосредственно внутри функции add(). Другим вариантом было бы, если бы я мог создать документ, получить его идентификатор, затем выполнить задачу загрузки и записать все данные после этого, но я не уверен, будет ли это считаться одной записью или двумя, и я не знаю, как для создания документа без установки каких-либо данных.
У меня сейчас примерно так:
CollectionReference activities = FirebaseFirestore.instance.collection('activities');
activities.add({
'postDate': DateTime.now(),
}).then((value) => _startUpload(id: value.id));
Где _startUpload — это функция, которая загружает файл в хранилище и потенциально может вернуть URL-адрес загрузки. Я хочу иметь доступ к этому URL-адресу в функции добавления следующим образом:
CollectionReference activities = FirebaseFirestore.instance.collection('activities');
activities.add({
'postDate': DateTime.now(),
'downloadURL': _startUpload(id: SomehowGetThisDocuments.id)
});

Вы можете сделать что-то вроде того, что описано в последнем абзаце этого раздела документации:
newActivityRef = activities.document();
newActivityRef.set({
'postDate': DateTime.now(),
'downloadURL': _startUpload(id: newActivityRef.documentID)
});
Это должно считаться одной записью, поскольку согласно документации .document().set() эквивалентно .add().