我正在Flutter项目中使用Google Maps。我正在尝试解析资产中的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
)
]),
);
},
),
我收到错误消息:无法将参数类型'Future'分配给参数类型'List'
答案 0 :(得分:0)
这是因为您的“ getPoints”函数是async
函数,因此返回Future
。这很正常,这里没有错。
您可以通过以下方式解决此问题:将GoogleMap包装在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
),
},
);
},
);
答案 1 :(得分:0)
第一种方法有问题。它永远不会真正返回任何东西。这是因为您在另一个方法内声明的方法内使用return。使用forEach时,您传入的是要应用于该列表中每个元素的方法。如果您说在该方法内返回,则只是从传递给forEach的方法中返回。