StreamBuilder во Flutter застрял с ConnectionState.waiting и отображает только отметку загрузки - PullRequest
2 голосов
/ 09 апреля 2020

Привет! Я пытаюсь динамически отображать данные внутри документов Firebase в моем флаттере, где они отображаются с использованием al oop, поэтому я сделал List<Widget> Cards и добавил к нему функцию makeItem(), которая содержит карточки, и поместите их в al oop, поэтому проблема в том, что когда я запускаю код, он все время выводит print(snapshot.connectionState); как ConnectionState.waiting, и это должен быть снимок asyn c, но он отказывается загружать данные по мере необходимости, Я должен отметить, что данные отображаются так, как нужно, когда я нажимаю «Горячая перезагрузка в Android Studio». поэтому я не знаю, как решить эту проблему. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Я думаю, у меня есть кое-что для тебя, попробуй это. Он работает на моем эмуляторе.

List<Widget> cards = [];
  Stream<QuerySnapshot> firebaseStream;

  @override
  void initState() {
    super.initState();
    firebaseStream = Firestore.instance.collection('Hearings').snapshots();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: StreamBuilder<QuerySnapshot>(
          stream: firebaseStream,
          builder: (BuildContext context,
              AsyncSnapshot<QuerySnapshot> asyncSnapshot) {
            List<DocumentSnapshot> snapData;

            if (asyncSnapshot.connectionState == ConnectionState.waiting) {
              return Container(
                child: Center(
                  child: CircularProgressIndicator(
                    backgroundColor: Colors.amber,
                    strokeWidth: 1,
                  ),
                ),
              );
            } else if (asyncSnapshot.connectionState ==
                ConnectionState.active) {
              snapData = asyncSnapshot.data.documents;
              if (asyncSnapshot.hasData) {
                for (int i = 0; i < snapData.length; i++) {
                  Widget card = Text(snapData[i].data['locationName']);

                  cards.add(card);
                }
              }
            }
            return ListView.builder(
              itemCount: cards.length,
              itemBuilder: (context, index) => cards[index],
            );
          },
        ),
      ),
    );

Я тоже получил плохие новости, но теперь, когда данные обновляются, они обнаруживают некоторое количество aws в вашей логике c, которое дублирует старые записи в вашем массиве. Ты увидишь. Это должно быть легко исправить, хотя.

1 голос
/ 09 апреля 2020

Можете ли вы попробовать следующее?

class MyList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _firestore.collection(widget.city).snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError)
          return Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
          case ConnectionState.waiting: return Center(child: CircularProgressIndicator(backgroundColor: Colors.amber,strokeWidth: 1),),
          default:
            return ListView(
              children: snapshot.data.documents.map((DocumentSnapshot document) {
                return makeItem(
                  pointName: document['name'],
                  huge: document['lastname'],
                  moderate: document['mobileNumber'],
                  none: document['location'],
                  fights: document['job'],
               );
              }).toList(),
           );
        }
      },
    );
  }
}
...