Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Dart:Getter即使在调用async Setter之后也返回null(确保方法中的字段不为null)_Flutter_Dart - Fatal编程技术网

Flutter Dart:Getter即使在调用async Setter之后也返回null(确保方法中的字段不为null)

Flutter Dart:Getter即使在调用async Setter之后也返回null(确保方法中的字段不为null),flutter,dart,Flutter,Dart,它感觉很简单,但却不起作用。我是否遗漏了一些非常基本的东西?这些getter和setter方法在类AppData中,它有一个静态字段:List(元素类型LatLng)_navRoute=List();由于某些原因,get总是返回null static void setNewRoute() async{ List<LatLng> navRoute = await _googleMapPolyline.getCoordinatesWithLocation( origin: L

它感觉很简单,但却不起作用。我是否遗漏了一些非常基本的东西?这些getter和setter方法在类AppData中,它有一个静态字段:List(元素类型LatLng)_navRoute=List();由于某些原因,get总是返回null

static void setNewRoute() async{
  List<LatLng> navRoute = await _googleMapPolyline.getCoordinatesWithLocation(
    origin: LatLng(_currentLocation.latitude, _currentLocation.longitude),
    destination: LatLng(_navDestination.latitude, _navDestination.longitude),
    mode: RouteMode.walking
  );
  _navRoute = navRoute;
  print("Nav route in set route is:" + _navRoute.toString()); //does not print null
}

static List<LatLng> getNavRoute(){
   print("Nav route in get route is:" + _navRoute.toString()); //prints null 
  return _navRoute; //returns null
}

这里有几个问题

首先,您的
async
方法应该返回
Future
,因为所有
async
方法都应该返回
Future

static Future setNewRoute()异步{
...
}
其次,你需要等待你的未来:

onPressed:(){
setState(()异步{
AppData.updateCurrentLocation();
setNavDestination(小部件的纬度、经度);
//这将在您实际设置导航路线后完成
等待AppData.setNewRoute();
AppData.setNavStatus(true);
});
打印(“当前位置为:“+AppData.getCurrentLocation().latitude.toString()+”,“+AppData.getCurrentLocation().latitude.toString());//不为空
打印(“导航目的地为:”+AppData.getNavDestination().latitude.toString()+”,“+AppData.getNavDestination().latitude.toString());//不为空
打印(“导航为:+AppData.getNavRoute().toString());//始终为空
Navigator.pop(context);//弹出底部ModalSheet
导航器。更换(
上下文
新材料路线(
builder:(BuildContext context)=>AppData.getTour(widget,
),
);
},
),

基本上
AppData.getNavRoute
返回
null
,因为
\u navRoute
实际上尚未设置,因为您没有等待它所依赖的异步操作完成。

这里有几个问题

首先,您的
async
方法应该返回
Future
,因为所有
async
方法都应该返回
Future

static Future setNewRoute()异步{
...
}
其次,你需要等待你的未来:

onPressed:(){
setState(()异步{
AppData.updateCurrentLocation();
setNavDestination(小部件的纬度、经度);
//这将在您实际设置导航路线后完成
等待AppData.setNewRoute();
AppData.setNavStatus(true);
});
打印(“当前位置为:“+AppData.getCurrentLocation().latitude.toString()+”,“+AppData.getCurrentLocation().latitude.toString());//不为空
打印(“导航目的地为:”+AppData.getNavDestination().latitude.toString()+”,“+AppData.getNavDestination().latitude.toString());//不为空
打印(“导航为:+AppData.getNavRoute().toString());//始终为空
Navigator.pop(context);//弹出底部ModalSheet
导航器。更换(
上下文
新材料路线(
builder:(BuildContext context)=>AppData.getTour(widget,
),
);
},
),

基本上
AppData.getNavRoute
返回
null
,因为
\u navRoute
实际上还没有设置,因为您没有等待它所依赖的异步操作完成。

将setter签名更改为将来的void,并按下:

onPressed: () async{
            AppData.updateCurrentLocation();
            AppData.setNavDestination(widget._latitude, widget._longitude);
            AppData.setNavStatus(true);
            await AppData.setNewRoute();
            setState(() {
            });
            print("Current location is: " + AppData.getCurrentLocation().latitude.toString() + " , " + AppData.getCurrentLocation().longitude.toString());
            print("Nav destination is: " + AppData.getNavDestination().latitude.toString()+ ", " + AppData.getNavDestination().longitude.toString());
            Navigator.pop(context); //pop the bottomModalSheet
            Navigator.pushReplacement(
                context, 
                new MaterialPageRoute(
                  builder: (BuildContext context) => AppData.getTour(widget._tourID),
                ),
            );
          },

它可以工作。

将setter签名更改为Future void,并按下:

onPressed: () async{
            AppData.updateCurrentLocation();
            AppData.setNavDestination(widget._latitude, widget._longitude);
            AppData.setNavStatus(true);
            await AppData.setNewRoute();
            setState(() {
            });
            print("Current location is: " + AppData.getCurrentLocation().latitude.toString() + " , " + AppData.getCurrentLocation().longitude.toString());
            print("Nav destination is: " + AppData.getNavDestination().latitude.toString()+ ", " + AppData.getNavDestination().longitude.toString());
            Navigator.pop(context); //pop the bottomModalSheet
            Navigator.pushReplacement(
                context, 
                new MaterialPageRoute(
                  builder: (BuildContext context) => AppData.getTour(widget._tourID),
                ),
            );
          },

非常感谢您的回复。这不太管用,但是,你的回答帮助我发现了错误。我将对此添加一个答案。为了澄清:它抛出了一个关于在change state中调用异步函数的断言。非常感谢您的回答。这不太管用,但是,你的回答帮助我发现了错误。我将对此添加一个答案。为了澄清:它抛出了一个关于在change state中调用异步函数的断言