База данных firebase flutter и проблема построителя ListView

Я предполагаю показать каждый элемент моего shopList в ListView, но я не могу понять причину, по которой он продолжает показывать одну и ту же запись. Пожалуйста, помогите решить эту проблему.

Здесь с кодом получите данные из базы данных firebase.

 databaseReference.once().then((DataSnapshot snapshot) {
    Map<dynamic, dynamic> getMap = snapshot.value;
    getMap.forEach((k, v) {

      Map<dynamic, dynamic> f = v;
      shop.key = k;
  shop.shopName = f["ShopName"];
  shop.tel = f["ShopTel"];
  shop.address = f["ShopAddress"];
  shop.thumbnail = f["Thumbnail"];
  debugPrint(k);

  shopList.add(shop);
  debugPrint(shopList[shopList.length-1].shopName);


});
  });

Результат DebugPrint:

  • флаттер: -LLySYDHHHx9WtCvKPrO
  • флаттер: shop1111
  • флаттер: -LLyXwR0nnAcx6_H4cYy
  • флаттер: shop2222

Вот с базой данных: База данных firebase flutter и проблема построителя ListView

Вот код для ListView:

child: Flexible(
                child: new ListView.builder(
                    itemCount: shopList.length,
                    itemBuilder: (context, index) {
                      return new Card(
                        color: Colors.red,
                        //elevation: 2.0,
                        child: new ListTile(

                          title: new Text("Name: ${shopList[index].key}"),

                        ),
                      );


                    }),
            ),

результат симулятора:

База данных firebase flutter и проблема построителя ListView

Почему бы не использовать анимированный список Firebase? У вас есть объект под названием магазин?

DomingoMG 10.09.2018 00:55
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
1
1
6 638
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Попробуй это.

Вот что бы я сделал

Shop.dart

class Shop {
  String key;
  String name;
  String address;
  String phone;
  String thumbnail;

  Shop(this.name,this.address,this.phone,this.thumbnail);

  Shop.fromSnapshot(DataSnapshot snapshot)
      : key = snapshot.key,
        name = snapshot.value["name"],
        address= snapshot.value["address"],
        phone= snapshot.value["phone"],
        thumbnail= snapshot.value["thumbnail"];


  toJson() {
    return {
      "name": name,
      "address": address,
      "phone": phone,
      "thumbnail": thumbnail,
    };
  }
}

main.dart

List<Shop> itemsShop = List();
Shop itemShop;
DatabaseReference itemRefShop;

@override
void initState() {
  super.initState();
  itemShop = Shop("", "", "", "");
  final FirebaseDatabase database = FirebaseDatabase.instance;
  itemRefShop = database.reference().child('Shop');
  itemRefShop.onChildAdded.listen(_onEntryAddedShop);
  itemRefShop.onChildChanged.listen(_onEntryChangedShop);
}

_onEntryAddedShop(Event event) {
  setState(() {
    itemsShop.add(Shop.fromSnapshot(event.snapshot));
  });
}

_onEntryChangedShop(Event event) {
  var old = itemsShop.singleWhere((entry) {
      return entry.key == event.snapshot.key;
  });
  setState(() {
      itemsShop[Shop.indexOf(old)] = Shop.fromSnapshot(event.snapshot);
  });
}

 @override
  Widget build(BuildContext context) {
     return new Container(
        child: new Column(
          children: <Widget>[
             new Flexible(
              child: new FirebaseAnimatedList(
                     query: itemRefShop,
                     itemBuilder:(_, DataSnapshot snapshot, Animation<double> animation, int index){
                       return new ListTile(
                         title: new Text(snapshot.value['name']),
                         subtitle: new Text(itemsShop[index].address),
                       );
                     }
               ),
          ]
        ),
     );
  }
}

спасибо, Могу ли я узнать, как и когда прекратить работу слушателя firebase?

GPH 10.09.2018 02:47

События _onEntryChangedShop сообщают вам событие, которое было изменено, а _onEntryAddedShop - событие, которое они были добавлены. Вы можете использовать print (event.snapshot.value); внутри каждого прослушивания

DomingoMG 10.09.2018 02:54

для swift и kotlin мы должны остановить слушателя. Мы можем где-нибудь остановить слушателя?

GPH 10.09.2018 02:57

Вы имеете в виду это? stackoverflow.com/questions/49983923/… Подробнее читайте здесь: docs.flutter.io/flutter/widgets/State/dispose.html

DomingoMG 10.09.2018 03:05

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