Flutter 将坐标从Http提取到数组中
我需要从http请求中获取一组坐标,并将其输入到我定义的数组中,然后在GoogleMaps中绘制标记。以下是我的代码: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
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;
}