Dart:即使在调用异步 Setter 后,Getter 也会返回 null(确保该字段在方法中不为 null)



感觉很简单,却不起作用。我在这里错过了一些非常基本的东西吗?这些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{
...
}

其次,您需要awaitFuture

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),
),
);
},

它有效。

最新更新