感觉很简单,却不起作用。我在这里错过了一些非常基本的东西吗?这些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
}
我调用这些函数的方式是:
onPressed: (){
setState(() {
AppData.updateCurrentLocation();
AppData.setNavDestination(widget._latitude, widget._longitude);
AppData.setNewRoute();
AppData.setNavStatus(true);
});
print("Current location is: " + AppData.getCurrentLocation().latitude.toString() + " , " + AppData.getCurrentLocation().longitude.toString()); //Not null
print("Nav destination is: " + AppData.getNavDestination().latitude.toString()+ ", " + AppData.getNavDestination().longitude.toString()); //Not null
print("Nav is: " + AppData.getNavRoute().toString()); //Always null
Navigator.pop(context); //pop the bottomModalSheet
Navigator.pushReplacement(
context,
new MaterialPageRoute(
builder: (BuildContext context) => AppData.getTour(widget._tourID),
),
);
},
),
这里有几个问题。
首先,您的async
方法应返回Future
,因为所有async
方法都应返回Future
:
static Future<void> setNewRoute() async{
...
}
其次,您需要await
Future
:
onPressed: (){
setState(() async {
AppData.updateCurrentLocation();
AppData.setNavDestination(widget._latitude, widget._longitude);
// This will complete once you've actually set _navRoute
await AppData.setNewRoute();
AppData.setNavStatus(true);
});
print("Current location is: " + AppData.getCurrentLocation().latitude.toString() + " , " + AppData.getCurrentLocation().longitude.toString()); //Not null
print("Nav destination is: " + AppData.getNavDestination().latitude.toString()+ ", " + AppData.getNavDestination().longitude.toString()); //Not null
print("Nav is: " + AppData.getNavRoute().toString()); //Always null
Navigator.pop(context); //pop the bottomModalSheet
Navigator.pushReplacement(
context,
new MaterialPageRoute(
builder: (BuildContext context) => AppData.getTour(widget._tourID),
),
);
},
),
基本上AppData.getNavRoute
返回null
因为实际上还没有设置_navRoute
因为您没有等待它所依赖的异步操作完成。
将二传手签名更改为未来无效,并按下为:
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),
),
);
},
它有效。