Как отобразить файл изображения в хранилище с помощью Flutter

Я обнаружил следующую проблему. Тогда я это понимаю.

Flutter / FireStore: как отобразить изображение из Firestore во Flutter?

Загрузка файла выполняется успешно.

var imgUrl = await ref.getDownloadURL();
print(imgUrl.toString());

Однако у меня есть следующая ошибка. Кажется, я делаю то же самое.

Необработанное исключение: PlatformException (Ошибка -13010, FIRStorageErrorDomain, Object images / cars / 40711b90-9db4-11ea-c602-a557c9b7697a.jpeg не существует.)

Однако я понятия не имею, как это отображать и обрабатывать.

Пожалуйста, дайте мне совет. Спасибо.


person tajihiro    schedule 24.05.2020    source источник
comment
У вас есть хранилище изображений в FireBaseStorage и для этого изображения есть соответствующие правила для доступа к ним?   -  person Jitesh Mohite    schedule 24.05.2020
comment
Я пытаюсь использовать то же приложение. Правила должны быть такими же. rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }   -  person tajihiro    schedule 24.05.2020
comment
введите путь к изображению в вашем браузере и проверьте, отображается ли изображение, если оно отображается, все в порядке   -  person Jitesh Mohite    schedule 24.05.2020


Ответы (1)


Сначала вам нужно добавить URL-адрес в firestore:

          StorageTaskSnapshot snapshot = await storage
              .ref()
              .child("images/$imageName")
              .putFile(file)
              .onComplete;
          if (snapshot.error == null) {
            final String downloadUrl =
                await snapshot.ref.getDownloadURL();
            await Firestore.instance
                .collection("images")
                .add({"url": downloadUrl, "name": imageName});
             }

Теперь в Firestore у вас будет коллекция с именем images и документ с URL-адресом изображения и именем изображения. Метод getDownloadUrl() возвращает URL-адрес изображения, чтобы вы могли сохранить его в Firestore. Затем, чтобы отобразить его, вы можете сделать следующее:

body: Container(
  padding: EdgeInsets.all(10.0),
  child: FutureBuilder(
    future: getImages(),
    builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        return ListView.builder(
            shrinkWrap: true,
            itemCount: snapshot.data.documents.length,
            itemBuilder: (BuildContext context, int index) {
              return ListTile(
                contentPadding: EdgeInsets.all(8.0),
                title:
                    Text(snapshot.data.documents[index].data["name"]),
                leading: Image.network(
                    snapshot.data.documents[index].data["url"],
                    fit: BoxFit.fill),
              );
            });
      } else if (snapshot.connectionState == ConnectionState.none) {
        return Text("No data");
      }
      return CircularProgressIndicator();
    },
  ),
),

/// code here

  Future<QuerySnapshot> getImages() {
    return fb.collection("images").getDocuments();
  }

Здесь вы используете метод getImages(), который извлекает все изображения из коллекции images. Для отображения изображения вы можете использовать виджет Image.network.

person Peter Haddad    schedule 24.05.2020
comment
Я могу принять неправильный дизайн для хранения данных в firestore. У меня нет хорошей идеи указывать изображения. Как мне хранить данные URL в firestore? - person tajihiro; 24.05.2020
comment
Я не понял, что ты имеешь в виду? - person Peter Haddad; 24.05.2020
comment
Я хочу загрузить изображение в firestrage. Затем получите изображение в ближайшее время, чтобы показать. Однако теперь у меня есть http-адрес в базе данных firedatabase. - person tajihiro; 24.05.2020
comment
Приведенный выше код делает именно то, что вы хотите: putFile добавляет изображение в хранилище firebase, add() создает документ с URL-адресом изображения в хранилище firebase. Во второй части кода изображение извлекается и отображается на экране. - person Peter Haddad; 24.05.2020
comment
Код взят из этого руководства petercoding.com/firebase / 2020/05/06 /, исходный код: github.com/PeterHdd/Firebase -Storage-Учебник - person Peter Haddad; 24.05.2020
comment
Я блуждаю, что, если у меня есть данные URL как Image.network( snapshot.data.documents[index].data["url"], как https://xxxx обычный URL, это может быть неправильным путем. - person tajihiro; 24.05.2020
comment
Как я могу хранить данные URL? - person tajihiro; 24.05.2020
comment
Давайте продолжим это обсуждение в чате. - person Peter Haddad; 24.05.2020