Я загружаю изображение, затем сохраняю его в хранилище 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();
}
}),
Пожалуйста, дайте мне знать, где мне следует внести изменения в код.
да, видимо какая-то ошибка. Как узнать в чем ошибка?
разве snapShot не является свойством ошибки?
Что ты имеешь в виду?
У него есть ненулевая ошибка, но как ее найти?
и каково содержание этого error свойства?
Использование Try catch?
просто установите точку останова в вашем if и проверьте этот объект
Я обновил изображение ошибки в вопросе. Пожалуйста, проверьте.





Проблема, вероятно, связана с тем, как 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 Можно print(snapshot.error). Я отредактировал свой ответ с помощью этого кода.
[cloud_firestore/permission-denied] Отсутствуют или недостаточны разрешения. В этом проблема.
@M99Coder Ах, потому что ваша база данных заблокирована с разными разрешениями. Пожалуйста, закройте этот вопрос и рассмотрите возможность прочитать документацию по правилам Firestore.
@M99Coder см. также stackoverflow.com/q/46590155/12349734
Таким образом, все ошибки исчезли, профиль FirebaseImage в разделе «Пользователи» обновляется, но пользовательский интерфейс не обновляется. Почему это произойдет?
@M99Coder не уверен, при нынешнем подходе все должно работать. Я бы посоветовал вам открыть новый вопрос
Вам также следует проверить
hasError, чтобы узнать, было ли исключение. в настоящее время это также покажет счетчик.