#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;
}
}