我在我的 Flutter 项目中使用 Google 地图。我正在尝试解析资产中的 json 文件,以便我可以在折线中使用其纬度和经度。我写了下面的代码,当我把它变成一个未来时,如下:
Future getPoints() async {
List<dynamic> parsedJson = jsonDecode(
'assets/busStops/stops_${widget.selectStation}.json');
List<Marker> allMarkersByPosition = [];
parsedJson.forEach((element) {
List<dynamic> coords = element["bs"];
coords.forEach((i) {
double lat = double.tryParse(i["latitude"]);
double lng = double.tryParse(i["longitude"]);
return [
LatLng(lat ?? 0.0, lng ?? 0.0),
];
});
});
}
并引用getPoints((,在这里:
child: FutureBuilder(
future:
_future,
builder: (context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
List<dynamic> parsedJson = jsonDecode(snapshot.data);
allMarkers = parsedJson.map((element) {
return Marker(
icon: customIcon,
markerId: MarkerId(element["Latitude"].toString()),
position: LatLng(element['Latitude'] ?? 0.0,
element['Longitude'] ?? 0.0));
}).toList();
return GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(-26.1711459, 27.9002758), zoom: 9.0),
markers: Set.from(allMarkers),
onMapCreated: mapCreated,
polylines: Set<Polyline>.of(<Polyline>[
Polyline(
polylineId: PolylineId('line'),
points: getPoints(),
visible: true,
color: Colors.blue
)
]),
);
},
),
我收到错误:参数类型"未来"无法分配给参数类型"列表">
这是因为您的"getPoints"函数是一个async
函数,因此返回Future
。这很正常,这里没有错。
你可以通过将你的谷歌地图包装在一个FutureBuilder中来解决这个问题(检查这里:https://www.youtube.com/watch?v=ek8ZPdWj4Qo(,并将"getPoints"作为参数传递给它的函数,就像这样:
return FutureBuilder(
future: getPoints(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting){
return CircularProgressIndicator();
}
return GoogleMap(
polylines: {
Polyline(
polylineId: PolylineId('line'),
points: snapshot.data
visible: true,
color: Colors.blue
),
},
);
},
);
第一种方法有问题。它永远不会真正返回任何东西。这是因为您在另一个方法中声明的方法中使用 return。使用 forEach 时,将传入一个要应用于该列表中每个元素的方法。如果在该方法中说 return,则只是从传递给 forEach 的方法返回。