Flutter 颤振-显示加载屏幕,直到firestore文档更改
我正在用flutter构建一个共享骑乘应用程序。到目前为止,我被困在如何沟通之间的骑手和司机的应用程序。 在rider向firestore db提交取货请求后,我希望加载屏幕显示,直到驾驶员接受请求(可能通过更新firestore db),然后移动到包含驾驶员信息的屏幕Flutter 颤振-显示加载屏幕,直到firestore文档更改,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我正在用flutter构建一个共享骑乘应用程序。到目前为止,我被困在如何沟通之间的骑手和司机的应用程序。 在rider向firestore db提交取货请求后,我希望加载屏幕显示,直到驾驶员接受请求(可能通过更新firestore db),然后移动到包含驾驶员信息的屏幕 if (event is PaymentMadeEvent) { yield TaxiBookingLoadingState( state: PaymentNotIni
if (event is PaymentMadeEvent) {
yield TaxiBookingLoadingState(
state:
PaymentNotInitializedState(booking: null, methodsAvaiable: null));
TaxiBooking booking = await TaxiBookingStorage.addDetails(TaxiBooking.named(paymentMethod: event.paymentMethod));
String docID = await TaxiBookingController.submitRequest(
booking.source.areaDetails,
booking.destination.areaDetails,
[booking.source.position.latitude,booking.source.position.longitude],
[booking.destination.position.latitude,booking.destination.position.longitude],
booking.estimatedPrice,
booking.estimatedDuration,
booking.estimatedDistance
);
booking = await TaxiBookingStorage.addDetails(TaxiBooking.named(dbID: docID));
await TaxiBookingController.generateToken();
TaxiDriver taxiDriver = await TaxiBookingController.getTaxiDriver(booking);
// Timer.periodic(Duration(seconds: 5), (Timer t) async* {
// } );
taxiDriver = await TaxiBookingController.getTaxiDriver(booking);
yield TaxiNotConfirmedState(booking: booking, driver: taxiDriver);
}
static-Future-getTaxiDriver(出租车预订)异步{
出租车司机2;
var driver=await Firestore.instance.collection(“骑手\皮卡\配对”)
//.where(DocumentReference,isEqualTo:booking.dbID)
.其中(“驾驶员id”,isEqualTo:'jk')
.getDocuments()
.然后((QuerySnapshot快照){
如果(snapshot.documents==[]){
taxis2=null;
}否则{
snapshot.documents.forEach((f)=>
taxis2=出租车司机。已命名(
驱动程序:
"https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/profilepic.jpg",
司机姓名:“约翰·多伊”,
驾驶执照:4.5,
出租车详情:“丰田花冠(ABJ823KU)”)
);
TaxiBookingStorage.addDetails(TaxiBooking.named(driver:taxis2.driverName));
}
返程的士2;
});
返回驱动器;
}
您应该使用.onSnapshot()
而不是.getDocument()
来实现这一点
这两种方法之间的区别在于getDocument()
将只检索一次文档,而onSnapshot()
将继续侦听Firestore上的任何事件。这些文件涵盖了这一点:和
希望您觉得这很有用。听起来是可行的,驾驶员应用程序,而骑手应用程序。这些链接应该足以让你开始。如果您被卡住了,请使用返回。我已使用再现问题的代码编辑了此帖子。到目前为止,当触发事件“PaymentMadeEvent”时,如果firestore查询为true,则运行正常;如果为false,则在加载屏幕上停止,并在firestore更新后仍保持不变,以将查询返回为true。您使用的是
.getDocuments()
,它只加载一次文档。要继续关注您的特定值,您需要。
static Future<TaxiDriver> getTaxiDriver(TaxiBooking booking) async {
TaxiDriver taxis2;
var driver = await Firestore.instance.collection("rider_pickup_pairing")
// .where(DocumentReference,isEqualTo: booking.dbID)
.where("driver_id",isEqualTo: 'jk')
.getDocuments()
.then((QuerySnapshot snapshot) {
if (snapshot.documents == []) {
taxis2 = null;
} else {
snapshot.documents.forEach((f) =>
taxis2 = TaxiDriver.named(
driverPic:
"https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/profilepic.jpg",
driverName: "John Doe",
driverRating: 4.5,
taxiDetails: "Toyota Corolla(ABJ823KU)")
);
TaxiBookingStorage.addDetails(TaxiBooking.named(driver: taxis2.driverName));
}
return taxis2;
});
return driver;
}