Как получить данные из базы данных firebase в реальном времени в flutter?

#firebase #flutter #firebase-realtime-database

# #firebase #flutter #firebase-realtime-database

Вопрос:

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

Теперь, из-за критических изменений, внесенных несколько месяцев назад, я не могу найти новые статьи или видео, которые могли бы помочь, но все, что я нахожу, — это старые, поэтому, если кто-нибудь здесь может мне помочь?

переменная для списка

 final dbRef = FirebaseDatabase.instance.reference().child("workshops");
 

теперь для отображения данных я пытаюсь следующим образом

 return FutureBuilder(
      future: dbRef.once(),
      builder: (context,AsyncSnapshot<DataSnapshot> snapshot){
        if(snapshot.hasData){
          workshopList.clear();
          Map<dynamic, dynamic> values = snapshot.data.value;
          values.forEach((key,values){
            workshopList.add(values);
          });
        }
        return ListView.builder(
          shrinkWrap: true,
          itemCount: workshopList.length,
          itemBuilder: (BuildContext context, index){
            return Card(
              child: Center(
                child: Column(
                  children: [
                    Text("name "  workshopList[index].workshopName)
                  ],
                ),
              ),
            );
          },
        );
      }
      
    );
 

Комментарии:

1. Что вы получаете

2. В Интернете есть много документации, в которой показано, как использовать обновленную firebase rtdb с flutter. Вы также делаете здесь много неправильных вещей. Ваш FutureBuilder вызывается каждый раз, когда виджет перестраивается, вместо того, чтобы вызываться только один раз. Ваш ListView.builder не создает каждый элемент лениво, потому что shrinkWrap имеет значение true. Ленивое построение означает, что вы создаете виджет только после того, как он должен появиться на экране. С помощью shrinkWrap вы создаете все сразу. Удалите shrinkWrap и оберните Listview расширенным

3. Документация здесь обновлена с любыми изменениями: firebase.flutter.dev/ docs/обзор

4. @Uni спасибо за ваш ответ, я буду работать над этим и благодарю всех вас, и я знаю, что было не так с моим кодом, который я приму как ответ.

Ответ №1:

Для объявления списка я делал так

 List<Workshop> worskshopList = [];
 

но то, что сработало для меня, было

 List<Map<dynamic,dynamic>> workshopList = [];
 

А теперь для отображения данных, которые я использую

workshopList [index].workshopName

теперь проблема в том, что я ссылаюсь не на имя мастерской базы данных, а на имя мастерской моего класса модели, поэтому я ничего не получаю.

теперь то, что сработало для меня, было

Список рабочих мест [индекс] [«имя_работ»]

теперь из старого списка я не могу использовать like list [index] [«»] это выдаст ошибку, например, «[]» не определено для списка.