Как уведомлять о новых данных, добавленных в поток в flutter

#flutter #firebase-realtime-database #stream-builder

#flutter #firebase-realtime-database #stream-builder

Вопрос:

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

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

Это мой код:

                         stream: FirebaseDatabase.instance.reference().child('PendingOrders').child('78945615').onValue,
                        builder: (context, snapshot){
                            if(snapshot.hasData amp;amp; !snapshot.hasError amp;amp; snapshot.data.snapshot.value!=null) {
                              DataSnapshot snapshot1 = snapshot.data.snapshot;
                              List<
                                  PendingOrderLoader> pendingOrderLoaderList = [
                              ];
                              int counter = 0;

                              final key = snapshot1.value.keys;
                              for (var i in key) {
                                PendingOrderLoader pendingOrderLoader1 = new PendingOrderLoader(
                                    snapshot1.value[i]['ContactNumber'],
                                    snapshot1.value[i]['TotalPrice'],
                                    snapshot1.value[i]['Date'],
                                    snapshot1.value[i]['Time'],
                                    snapshot1.value[i]['Address']['Line1'],
                                    snapshot1.value[i]['Address']['Line2'],

                                );
                                pendingOrderLoaderList.add(pendingOrderLoader1);
                                pendingOrderLoaderList.sort((a, b) =>
                                    a.Counter.compareTo(b.Counter));
                                counter = counter 1;
                              }
                              return
                                snapshot.data.snapshot.value == null
                                  ? SizedBox()

                                  :
                              ListView.builder
                                (
                                  shrinkWrap: true,
                                  scrollDirection: Axis.vertical,
                                  itemCount: pendingOrderLoaderList.length,
                                  itemBuilder: (context, index) {
                                    return pendingOrderLoaderList.length == 0
                                        ? Container(
                                      child: Text("No Pending Items"),)
                                        : Padding(
                                      padding: const EdgeInsets.all(8.0),
                                      child: InkWell(
                                        onTap: () {

                                          Navigator.push(
                                              context, MaterialPageRoute(
                                              builder: (context) =>
                                                  PendingOrderDetails(
                                                      orderID: pendingOrderLoaderList[index]
                                                          .OrderID,
                                                      totalPrice: pendingOrderLoaderList[index]
                                                          .TotalPrice,
                                                      contactNumber: pendingOrderLoaderList[index]
                                                          .ContactNumber,
                                                      line1: pendingOrderLoaderList[index]
                                                          .Line1,
                                                      line2: pendingOrderLoaderList[index]
                                                          .Line2,
                                                      Date: pendingOrderLoaderList[index]
                                                          .Date,
                                                      Time: pendingOrderLoaderList[index]
                                                          .Time,
                                                      PaymentMethod: pendingOrderLoaderList[index]
                                                          .PaymentMethod,
                                                  )
                                          ));
                                        },
                                        child: Column(
                                          crossAxisAlignment: CrossAxisAlignment
                                              .start,
                                          children: <Widget>[
                                            Container(
                                                margin: EdgeInsets.only(
                                                    left: 10, top: 10),
                                                decoration: BoxDecoration(
                                                    borderRadius: BorderRadius
                                                        .circular(10),
                                                    color: Colors.cyan),
                                                child: Padding(
                                                  padding: const EdgeInsets.all(
                                                      8.0),
                                                  child: Column(
                                                    children: <Widget>[
                                                      Row(
                                                        mainAxisAlignment: MainAxisAlignment
                                                            .spaceEvenly,
                                                        children: <Widget>[
                                                          Text(
                                                              (pendingOrderLoaderList[index]
                                                                  .Counter)
                                                                  .toString()),
                                                          Text(
                                                              pendingOrderLoaderList[index]
                                                                  .PaymentMethod),
                                                          Text(
                                                              pendingOrderLoaderList[index]
                                                                  .OrderID),
                                                          Text(
                                                              pendingOrderLoaderList[index]
                                                                  .Time),
                                                        ],
                                                      ),

                                                    ],
                                                  ),
                                                )
                                            ),

                                          ],

                                        ),
                                      ),
                                    );
                                  }
                              );
                            }else{
                              return   Center(child: CircularProgressIndicator()
                            );
                            }


                        })```




 

Ответ №1:

Я думаю, вы можете использовать ConnectionState для этого. Проверьте состояние подключения вашего снимка.Если это превратит ‘done’ в ‘active’, это означает, что что-то добавлено.

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

1. Привет, @Emin, если ты не возражаешь, можешь добавить небольшой фрагмент кода?

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

3. На самом деле я только что понял, что это не работает, но streambuilder обновляется, когда что-то добавляется в базу данных. Итак, если я правильно понял ваш вопрос, вы можете просто дать свое предупреждение, прежде чем ваш StreamBuilder не вернет ListView.Builder() .

4. На самом деле, чего я хочу, когда новые данные добавляются в список, появляется оператор печати с сообщением о добавлении новых данных.

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

Ответ №2:

просто проверьте длину выбранных данных и создайте оповещение (или звуковой сигнал)

 Stream<List<MESSAGELIST>> chatStream() async* {
    while (true) {
      await Future.delayed(Duration(milliseconds: 500));
      List<MESSAGELIST> someChat = await getMessageList(bid);
      if(someChat.length > dataLength) {  setState(() {
        sound.play('ding.mp3');
        createChatNotifications();
        dataLength = someChat.length;
      });}
      yield someChat;
    }
  }