Почему Streambuilder не обновляет пользовательский интерфейс?

Я загружаю изображение, затем сохраняю его в хранилище Firebase, а затем сохраняю ссылку в базе данных Firebase. Я добавил Streambuilder для обновления пользовательского интерфейса. Однако, когда я это делаю, я получаю бесконечный круговой индикатор выполнения. Я уверен, что с моим кодом Streambuilder что-то не так.

Фрагмент кода следующий:

class EditProfile extends StatefulWidget {
  const EditProfile({
    super.key,
    required this.userData,
  });
  final UserModel userData;

  @override
  State<EditProfile> createState() => _EditProfileState();
}

class _EditProfileState extends State<EditProfile> {
.....

StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(
                      stream: FirebaseFirestore.instance
                          .collection('users')
                          .snapshots(),
                      builder: (context, snapshot) {
                        if (snapshot.hasData) {
                          return CircleAvatar(
                            radius: 75,
                            backgroundImage: NetworkImage(
                                widget.userData.profileImage.toString()),
                          );
                        } else {
                          return const CircularProgressIndicator();
                        }
                      }),

Пожалуйста, дайте мне знать, где мне следует внести изменения в код.

Вам также следует проверить hasError, чтобы узнать, было ли исключение. в настоящее время это также покажет счетчик.

Thomas 19.05.2024 12:46

да, видимо какая-то ошибка. Как узнать в чем ошибка?

M99Coder 19.05.2024 12:51

разве snapShot не является свойством ошибки?

Thomas 19.05.2024 12:53

Что ты имеешь в виду?

M99Coder 19.05.2024 12:53

У него есть ненулевая ошибка, но как ее найти?

M99Coder 19.05.2024 12:56

и каково содержание этого error свойства?

Thomas 19.05.2024 12:57

Использование Try catch?

M99Coder 19.05.2024 13:28

просто установите точку останова в вашем if и проверьте этот объект

Thomas 19.05.2024 13:56

Я обновил изображение ошибки в вопросе. Пожалуйста, проверьте.

M99Coder 19.05.2024 14:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, вероятно, связана с тем, как StreamBuilder обрабатывает разные состояния снимка.

Значок CircularProgressIndicator отображается постоянно, поскольку отсутствует надлежащая обработка состояния соединения, ошибок и случаев пустых данных.

в частности, проблема может быть в вашем коде, который вы делаете:

 if (snapshot.hasData) { // ---> Only if there's data
      return CircleAvatar(
        radius: 75,
        backgroundImage: NetworkImage(widget.userData.profileImage.toString()),
      );
    } else {
       // --> if there's no data or loading
      return const CircularProgressIndicator();
    }

это означает, что только при наличии реальных документов (например, .hasData) будет отображаться CircleAvatar.

Вместо этого вы можете использовать, который будет учитывать все правильные состояния загрузки и наличие данных (документов):

StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(
  stream: FirebaseFirestore.instance.collection('users').snapshots(),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const CircularProgressIndicator();
    } else if (snapshot.hasError) {
      print(snapshot.error); // --> Debug the error here
      return const Text('Something went wrong');
    } else if (!snapshot.hasData || snapshot.data!.docs.isEmpty) {
      return const Text('No data available');
    } else {
      return CircleAvatar(
        radius: 75,
        backgroundImage: NetworkImage(widget.userData.profileImage.toString()),
      );
    }
  },
),

Примечание: Если возникла ошибка (что может быть в вашем случае), появится текст «Что-то пошло не так», который вам придется отладить (я добавил print(snapshot.error)).

Я всегда получаю состояние snapshot.hasError (что-то пошло не так). Так что да, придется отладить и выяснить, что пошло не так. Не уверен, какой подход лучше всего.

M99Coder 19.05.2024 15:10

@M99Coder Можно print(snapshot.error). Я отредактировал свой ответ с помощью этого кода.

MendelG 19.05.2024 15:13

[cloud_firestore/permission-denied] Отсутствуют или недостаточны разрешения. В этом проблема.

M99Coder 19.05.2024 15:17

@M99Coder Ах, потому что ваша база данных заблокирована с разными разрешениями. Пожалуйста, закройте этот вопрос и рассмотрите возможность прочитать документацию по правилам Firestore.

MendelG 19.05.2024 15:18

@M99Coder см. также stackoverflow.com/q/46590155/12349734

MendelG 19.05.2024 15:19

Таким образом, все ошибки исчезли, профиль FirebaseImage в разделе «Пользователи» обновляется, но пользовательский интерфейс не обновляется. Почему это произойдет?

M99Coder 19.05.2024 15:33

@M99Coder не уверен, при нынешнем подходе все должно работать. Я бы посоветовал вам открыть новый вопрос

MendelG 19.05.2024 15:47

Другие вопросы по теме