Flutter 我试图在异步函数中运行两个wait和一个navigator.push,我在flifter中遇到了这个错误

Flutter 我试图在异步函数中运行两个wait和一个navigator.push,我在flifter中遇到了这个错误,flutter,asynchronous,async-await,navigator,Flutter,Asynchronous,Async Await,Navigator,错误: [错误:flatter/lib/ui/ui\u dart\u state.cc(186)]未处理的异常:查找停用小部件的祖先不安全。 E/flatter(6342):此时小部件元素树的状态不再稳定。 E/flatter(6342):为了在dispose()方法中安全地引用小部件的祖先,请通过在小部件的didChangeDependencies()方法中调用dependOnInheritedWidgetOfExactType()来保存对祖先的引用。 E/颤振(6342):#0元素。_调试检

错误: [错误:flatter/lib/ui/ui\u dart\u state.cc(186)]未处理的异常:查找停用小部件的祖先不安全。 E/flatter(6342):此时小部件元素树的状态不再稳定。 E/flatter(6342):为了在dispose()方法中安全地引用小部件的祖先,请通过在小部件的didChangeDependencies()方法中调用dependOnInheritedWidgetOfExactType()来保存对祖先的引用。 E/颤振(6342):#0元素。_调试检查状态为激活的组件。(包:flatter/src/widgets/framework.dart:3864:9) E/flatter(6342):#1个元素。_debugCheckStateIsActiveForAncestorLookup(包:flatter/src/widgets/framework.dart:3878:6) E/flatter(6342):#2 Element.findAncestorStateOfType(包:flatter/src/widgets/framework.dart:3926:12) E/flatter(6342):#3 Navigator.of(包:flatter/src/widgets/Navigator.dart:2706:40) E/flatter(6342):#4 Navigator.pop(包:flatter/src/widgets/Navigator.dart:2592:15) E/颤振(6342):#5 NotificationDialog.CheckAvailability of RIDE(包:驱动程序应用程序/通知/NotificationDialog.dart:240:20) E/颤振(6342):

我的代码片段:

 void checkAvailabilityOfRide(context) async {
    
      var rideRequestId = await rideRequestRef.once();
           ...
      var dataSnapShot2 =  await newRequestsRef.child(rideRequestId.value).once();
           ...
     Navigator.push(context, MaterialPageRoute(builder: (context)=> 
      NewRideScreen(rideDetails: rideDetails)));
         ...
   }
更新代码:

 Widget build(BuildContext context) {
 return Dialog(
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
  backgroundColor: Colors.transparent,
  elevation: 1.0,
  child: Container(
    margin: EdgeInsets.all(5.0),
    width: double.infinity,
    decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.circular(5.0),
    ),
    child: Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        SizedBox(height: 30.0),
        Image.asset("images/taxi.png", width: 120.0,),
        SizedBox(height: 18.0,),
        Text("New Ride Request", style: TextStyle(fontFamily: "Brand-Bold", fontSize: 18.0,),),
        SizedBox(height: 30.0),
        Padding(
          padding: EdgeInsets.all(18.0),
          child: Column(
            children: [

              Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Image.asset("images/pickicon.png", height: 16.0, width: 16.0,),
                  SizedBox(width: 20.0,),
                  Expanded(
                    child: Container(child: Text(rideDetails.pickup_address, style: TextStyle(fontSize: 18.0),)),
                  ),
                ],
              ),
              SizedBox(height: 15.0),

              Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Image.asset("images/desticon.png", height: 16.0, width: 16.0,),
                  SizedBox(width: 20.0,),
                  Expanded(
                    child: Container(child: Text(rideDetails.dropOff_address, style: TextStyle(fontSize: 18.0),)),
                  )
                ],
              ),
              SizedBox(height: 15.0),

            ],
          ),
        ),

        SizedBox(height: 20.0),
        Divider(height: 2.0,color: Colors.black, thickness: 2.0,),
        SizedBox(height: 8.0),

        Padding(
          padding: EdgeInsets.all(20.0),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [

              FlatButton(
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(18.0),
                    side: BorderSide(color: Colors.red)),
                color: Colors.white,
                textColor: Colors.red,
                padding: EdgeInsets.all(8.0),
                onPressed: ()
                {
                  assetsAudioPlayer.stop();
                  Navigator.pop(context);
                },
                child: Text(
                  "Cancel".toUpperCase(),
                  style: TextStyle(
                    fontSize: 14.0,
                  ),
                ),
              ),

              SizedBox(width: 25.0),

              RaisedButton(
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(18.0),
                    side: BorderSide(color: Colors.green)),
                onPressed: ()
                {
                  assetsAudioPlayer.stop();
                  checkAvailabilityOfRide0(context);
                  checkAvailabilityOfRide(context);
                },

                color: Colors.green,
                textColor: Colors.white,
                child: Text("Accept".toUpperCase(),
                    style: TextStyle(fontSize: 14)),
              ),

            ],
          ),
        ),

        SizedBox(height: 10.0),
      ],
    ),
  ),
);
}


我不确定这是否与Nin Yu有关,过去几天我尝试使用@Patrick answer修复相同的错误,但有时也不起作用。当我仔细调试它时,我发现我多次调用了包含Navigator的方法。所以有时候我会得到上下文,然后安全地转到下一个屏幕,有些屏幕会抛出错误。我建议使用调试方法并检查它是否发生。

如海报所示(请参见问题注释),错误是由于在
Navigator.pop
Navigator.push
之间执行异步
wait
导致的。我猜
wait
push
之前会给颤振时间来破坏当前屏幕,这会导致
push
上出现异常


请注意,“颤振”提供了多种同时弹出和推送的方式,从而避免了插入代码的可能性:
pushReplacement
pushReplacementNamed
将当前屏幕替换为新屏幕,
popAndPushNamed
对不同的动画也有相同的效果。

这是否回答了您的问题?仍然是相同的错误,……查找停用的小部件的祖先是不安全的。请显示调用此函数的上下文,并提供足够的代码来重现问题。@PatrickO'Hara请查看我添加的代码编辑时不显示调用此函数的上下文,例如,调用它的
小部件
。谢谢你的建议,我感谢你为解决我的问题所做的努力,我希望你将来能帮助我更多
Future<void> checkAvailabilityOfRide(context) async {
   var rideRequestId = await rideRequestRef.once();
   Navigator.push(context);
   String theRideId = "";
   var dataSnapShot2 =  await newRequestsRef.child( rideRequestId.value).once();
   /*... process...*/

   if(theRideId == rideDetails.ride_request_id && r2canShare) {
   rideRequestRef.set("accepted");
   AssistantMethods.disableHomeTabLiveLocationUpdates();
   Navigator.push(context, MaterialPageRoute(builder: (context) => 
   NewRideScreen(rideDetails: rideDetails)));
 }
   else if(theRideId == 'cancelled') {
   displayToastMessage("Ride has been Cancelled.", context);
   }
   else if(theRideId == 'cancelled') {
   displayToastMessage("Ride has been time out.", context);
   }
   else if(r2canShare == false) {
   assetsAudioPlayer.stop();
   displayToastMessage("Rider 2 cannot shared ride, out of range.", context);
   }
   else {
   displayToastMessage("Ride not exists.", context);
   }
  void checkAvailabilityOfRide(context)async{
    var dataSnapShot2 =  await newRequestsRef.child( (await 
      rideRequestRef.once()).value).once();
    Navigator.pop(context);
    String theRideId = "";
    /*... process...*/