无法将参数类型“ Future”分配给参数类型“ List <LatLng>”

时间:2019-11-26 18:20:44

标签: json google-maps flutter dart polyline

我正在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'

2 个答案:

答案 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的方法中返回。