Flutter 颤振-显示加载屏幕,直到firestore文档更改

Flutter 颤振-显示加载屏幕,直到firestore文档更改,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我正在用flutter构建一个共享骑乘应用程序。到目前为止,我被困在如何沟通之间的骑手和司机的应用程序。 在rider向firestore db提交取货请求后,我希望加载屏幕显示,直到驾驶员接受请求(可能通过更新firestore db),然后移动到包含驾驶员信息的屏幕 if (event is PaymentMadeEvent) { yield TaxiBookingLoadingState( state: PaymentNotIni

我正在用flutter构建一个共享骑乘应用程序。到目前为止,我被困在如何沟通之间的骑手和司机的应用程序。 在rider向firestore db提交取货请求后,我希望加载屏幕显示,直到驾驶员接受请求(可能通过更新firestore db),然后移动到包含驾驶员信息的屏幕

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;

  }