Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 将坐标从Http提取到数组中_Flutter - Fatal编程技术网

Flutter 将坐标从Http提取到数组中

Flutter 将坐标从Http提取到数组中,flutter,Flutter,我需要从http请求中获取一组坐标,并将其输入到我定义的数组中,然后在GoogleMaps中绘制标记。以下是我的代码: final List<LatLng> _markerLocations = [ LatLng(3.082519, 101.592201), LatLng(3.081758, 101.583433), LatLng(3.079726, 101.581876), LatLng(3.082197, 101.589534), LatL

我需要从http请求中获取一组坐标,并将其输入到我定义的数组中,然后在GoogleMaps中绘制标记。以下是我的代码:

final List<LatLng> _markerLocations = [
    LatLng(3.082519, 101.592201),
    LatLng(3.081758, 101.583433),
    LatLng(3.079726, 101.581876),
    LatLng(3.082197, 101.589534),
    LatLng(3.073675, 101.593028)
  ];
现在我需要从
检查点
数组中获取的
纬度
经度
。 从这些坐标中,我可以使用我定义的
for
循环函数将其绘制到地图中

#
_markerLocations
#数组中的硬编码坐标应替换为http正文中的lat和lng# 下面是一个附加代码:-

class MapLocationScreen extends StatefulWidget {
  final MarkerApiService markerApi = MarkerApiService();
  @override
  _MapLocationScreenState createState() => _MapLocationScreenState();
}

class _MapLocationScreenState extends State<MapLocationScreen> {
  final Completer<GoogleMapController> mapController = Completer();
  Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
  final markerKey = GlobalKey();
  final Map<String, Marker> _markers = {};
  final Set<Marker> _markerloop = {};
  final AuthApiService auth = AuthApiService();
  List<LatLng> _latLngs;
  final data = MarkerApiService().getCoordinates();

  @override
  void initState() {
    super.initState();
    _latLngs = _parseLatLngsFromJSON(data);
    widget.markerApi.getCoordinates().then((body) {
      print(body);
    });
  }

  List<LatLng> _parseLatLngsFromJSON(Map<String, dynamic> data) {
    List<Map<String, dynamic>> rondaLoopCheckpoints =
        data["body"]["rondaLoopCheckpointsList"];
        List<Marker> latLngData = <Marker>[];
    rondaLoopCheckpoints.forEach((Map<String, dynamic> item) {
      Map<String, dynamic> checkPoint = item["checkpoints"];
      latLngData.add(Marker(
        markerId: MarkerId('loop_route'),
        position: LatLng(checkPoint['latitude'], checkPoint['longitude'])
      ));
    });
    return latLngData;
  }
}

@override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        GoogleMap(
          initialCameraPosition:
              CameraPosition(target: LatLng(3.082519, 101.592201), zoom: 15.0),
          onMapCreated: _onMapCreated,
          myLocationEnabled: true,
          mapType: MapType.normal,
          markers: _markerloop,
          // Set<Marker>.of(markers.values),
        ),
        Positioned(
          bottom: 50,
          right: 0,
          child: FlatButton(
            child: Icon(FontAwesomeIcons.mapMarkedAlt),
            onPressed: () => _initMarkers(),
          ),
        ),
      ],
    );
  }
class MapLocationScreen扩展StatefulWidget{
最终MarkerApiService markerApi=MarkerApiService();
@凌驾
_MapLocationScreenState createState()=>\u MapLocationScreenState();
}
类\u MapLocationScreenState扩展状态{
最终完成器映射控制器=完成器();
地图标记={};
final markerKey=GlobalKey();
最终地图_标记={};
最终集_markerloop={};
最终AuthApiService auth=AuthApiService();
列表_latLngs;
最终数据=MarkerApiService().getCoordinates();
@凌驾
void initState(){
super.initState();
_latLngs=_parseLatLngsFromJSON(数据);
widget.markerApi.getCoordinates()然后((正文){
印刷品(正文);
});
}
列表_parseLatLngsFromJSON(地图数据){
列出Rondaloop检查点=
数据[“正文”][“Rondaloop检查点列表”];
列表latLngData=[];
forEach((映射项){
映射检查点=项目[“检查点];
latLngData.add(标记(
markerId:markerId('loop_route'),
位置:LatLng(检查点['纬度]、检查点['经度])
));
});
返回latLngData;
}
}
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
谷歌地图(
初始摄像机位置:
摄像机位置(目标:LatLng(3.082519101.592201),变焦:15.0),
onMapCreated:_onMapCreated,
myLocationEnabled:对,
mapType:mapType.normal,
标记:_markerloop,
//一组(标记值),
),
定位(
底数:50,
右:0,,
孩子:扁平按钮(
子:图标(FontAwesomeIcons.mapMarkedAlt),
onPressed:()=>\u initMarkers(),
),
),
],
);
}
以下是HTTP请求:

import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

class MarkerApiService with ChangeNotifier {
  static final MarkerApiService _singleton = MarkerApiService._internal();
  Map body;

  factory MarkerApiService() {
    return _singleton;
  }
  MarkerApiService._internal();

  //get Token
  Future<String> get token async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getString('token');
  }

  //save token
  Future<bool> _persistToken(token) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.setString('token', token);
  }

  Future<bool> _saveToken(String token) async {
    if (token != null) {
      await _persistToken(token);
      return true;
    }
    return false;
  }

  Future<Map<String, dynamic>> getCoordinates() async {
    //save
    SharedPreferences prefs = await SharedPreferences.getInstance();
    final token = prefs.getString('token');
    final String url =
        'http://192.168.200.65:8081/rest/auth/getDetailMobileUser';
    await Future.delayed(Duration(milliseconds: 1000));

    final res = await http.post(Uri.encodeFull(url), headers: {
      "Content-Type": "application/json",
      "Authorization": token,
    });
    body = json.decode(res.body);
    Map<String,dynamic> latLngData = await getCoordinates();
    return body;
  }
}
导入'dart:io';
进口“包装:颤振/cupertino.dart”;
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“dart:convert”;
导入“package:shared_preferences/shared_preferences.dart”;
使用ChangeNotifier类MarkerApiService{
静态最终MarkerApiService _singleton=MarkerApiService._internal();
地图主体;
工厂标记服务(){
返回单件;
}
MarkerApiService._internal();
//领取代币
未来获取令牌异步{
SharedReferences prefs=等待SharedReferences.getInstance();
返回prefs.getString('token');
}
//保存令牌
未来持久令牌(令牌)异步{
SharedReferences prefs=等待SharedReferences.getInstance();
返回prefs.setString('token',token);
}
Future\u saveToken(字符串令牌)异步{
if(令牌!=null){
等待令牌(令牌);
返回true;
}
返回false;
}
Future getCoordinates()异步{
//拯救
SharedReferences prefs=等待SharedReferences.getInstance();
final token=prefs.getString('token');
最终字符串url=
'http://192.168.200.65:8081/rest/auth/getDetailMobileUser';
等待未来。延迟(持续时间(毫秒:1000));
final res=wait http.post(Uri.encodeFull(url)),标题:{
“内容类型”:“应用程序/json”,
“授权”:令牌,
});
body=json.decode(res.body);
Map latLngData=wait getCoordinates();
返回体;
}
}

将此文件保存在执行http请求的位置

final Response response = await http.get("Your URL");

final String body = response.body;
// your list.
List<LatLng> _latLngs = _parseLatLngsFromJSON(jsonDecode(body));
final Response Response=wait http.get(“您的URL”);
最终字符串体=response.body;
//你的名单。
列表_latLngs=_parseLatLngsFromJSON(jsonDecode(body));
下面是解析JSON的方法

List<LatLng> _parseLatLngsFromJSON(Map<String, dynamic> data) {
  List<Map<String, dynamic>> rondaLoopCheckpoints =
      data["body"]["rondaLoopCheckpointsList"];
      List<LatLng> latLngData = <LatLng>[];
  rondaLoopCheckpoints.forEach((Map<String, dynamic> item) {
    Map<String, dynamic> checkPoint = item["checkpoints"];
    latLngData.add(LatLng(
      num.tryParse(checkPoint["latitude"]),
      num.tryParse(checkPoint["longtitude"]),
    ));
  });
  return latLngData;
}
List\u parseLatLngsFromJSON(地图数据){
列出Rondaloop检查点=
数据[“正文”][“Rondaloop检查点列表”];
列表latLngData=[];
forEach((映射项){
映射检查点=项目[“检查点];
latLngData.add(LatLng(
num.tryParse(检查点[“纬度]),
tryParse数(检查点[“长度]),
));
});
返回latLngData;
}
现在你有了你想要的板条清单

如果你想要演示,
我希望这会有所帮助,如果您有任何疑问,请告诉我。

首先,感谢您抽出时间为我制作演示。我在获取代码时遇到了一个错误。我已经为我的Http post方法做了一个
Future
,在代码中它在
\u latLngs=\u parseLatLngsFromJSON(数据)处返回一个错误错误-
参数类型“Future”无法分配给参数类型“Map”
在从中获取值之前,是否调用了wait on your Future??这就是问题所在。。如果不使用map=await future,则会出现此错误。打开此链接时没有代码,只有默认模板。map>latLngData=await getCoordinates();像这样调用您的方法。你不会犯那个错误。
final Response response = await http.get("Your URL");

final String body = response.body;
// your list.
List<LatLng> _latLngs = _parseLatLngsFromJSON(jsonDecode(body));
List<LatLng> _parseLatLngsFromJSON(Map<String, dynamic> data) {
  List<Map<String, dynamic>> rondaLoopCheckpoints =
      data["body"]["rondaLoopCheckpointsList"];
      List<LatLng> latLngData = <LatLng>[];
  rondaLoopCheckpoints.forEach((Map<String, dynamic> item) {
    Map<String, dynamic> checkPoint = item["checkpoints"];
    latLngData.add(LatLng(
      num.tryParse(checkPoint["latitude"]),
      num.tryParse(checkPoint["longtitude"]),
    ));
  });
  return latLngData;
}