【问题标题】:How to notify new data added in stream in flutter如何在颤动中通知流中添加的新数据
【发布时间】:2021-04-11 12:03:19
【问题描述】:

每当将新数据添加到数据库时,我的代码都可以正常工作,它会出现在我的屏幕上,而无需刷新页面任何声音以及通知用户添加了新数据。

我尝试了一种方法,即计算 List 中的项目数,然后跟踪它是否增加了 1,然后发送消息,但这不起作用。

这是我的代码:

                        stream: FirebaseDatabase.instance.reference().child('PendingOrders').child('78945615').onValue,
                        builder: (context, snapshot){
                            if(snapshot.hasData && !snapshot.hasError && 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()
                            );
                            }


                        })```




【问题讨论】:

    标签: flutter firebase-realtime-database stream-builder


    【解决方案1】:

    我认为您可以为此使用 ConnectionState。检查快照的 connectionState。如果这将“完成”变为“活动”,则表示添加了一些内容。

    【讨论】:

    • 嘿@Emin,如果您不介意可以添加一小段代码吗?
    • 当列表中有数据时,它总是显示为活动状态,我只想在添加新数据时触发。
    • 实际上我刚刚意识到它不起作用,但是当将某些内容添加到数据库时,streambuilder 会自行刷新。因此,如果我正确理解您的问题,您可以在您的 streamBuilder 没有返回 ListView.Builder() 之前发出警告。
    • 其实我想要的,当新数据被添加到列表时,它会弹出打印语句说新数据被添加。
    • 每当我添加新数据时,它会自动出现在屏幕上,但我想通过任何消息或音调触发新数据,因为它出现在屏幕上。
    【解决方案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;
        }
      }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2021-06-05
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2021-07-18
      • 2023-02-05
      • 2020-03-19
      相关资源
      最近更新 更多