List 将标记数组添加到Flatter_贴图仅在移动贴图后显示
在这里使用。我正在从我的资产目录中的本地json文件加载标记。地图绘制时,标记加载到我的标记数组中,但直到我在屏幕上移动地图后,标记才会显示。我对这里有点陌生,所以我一定是在标记器加载部分做错了什么 我试过一些东西。目前这是我的颤振图和标记阵列代码:List 将标记数组添加到Flatter_贴图仅在移动贴图后显示,list,flutter,dart,List,Flutter,Dart,在这里使用。我正在从我的资产目录中的本地json文件加载标记。地图绘制时,标记加载到我的标记数组中,但直到我在屏幕上移动地图后,标记才会显示。我对这里有点陌生,所以我一定是在标记器加载部分做错了什么 我试过一些东西。目前这是我的颤振图和标记阵列代码: class _MapWidget extends StatelessWidget { //const so flutter doesn't rebuild it each time... const _MapWidget(); // fi
class _MapWidget extends StatelessWidget {
//const so flutter doesn't rebuild it each time...
const _MapWidget();
// final SiteID sid = null;
// final Sites site = null;
@override
Widget build(BuildContext context) {
print("add map");
return new FlutterMap(
options: new MapOptions(
center: new LatLng(40.0, -120.0),
zoom: 8.0,
),
layers: [
TileLayerOptions(
urlTemplate:
'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
subdomains: ['a', 'b', 'c'],
tileProvider: CachedNetworkTileProvider(),
),
new MarkerLayerOptions(markers: _MapDataState().marker),
],
);
}
}
在_MapDataState()构造函数上加载标记数组似乎是我唯一可以将数组共享到我的_MapWidget中的地方:
class _MapDataState extends State<MapData> {
List<SitesList> sl = [];
List<SnoTelSite> sts = [];
var marker = <Marker>[];
_MapDataState(){
print("map data state");
loadSites().then((sitesdata) {
print('Loaded Sites Asset JSON');
//clone sitesdata into sts array
sts..addAll(sitesdata);
sts.forEach((s) {
marker.add(
Marker(
point: new LatLng(double.parse(s.lat),double.parse(s.lng)),
builder: (ctx) => _MarkerPopUp(sitename: s.name, siteelevation: s.elevation, siteid: s.siteID,),
),
);
});
});
}
// @override
// initState() {
// print("INIT STATE");
// super.initState();
// }
//local load assets ... constants hold path snotelsitesjson
Future<String> _loadSiteAssets() async {
return await rootBundle.loadString(snotelsitesjson);
}
Future loadSites() async {
String jsonString = await _loadSiteAssets();
final jsonResponse = json.decode(jsonString);
SitesList sitesList = new SitesList.fromJson(jsonResponse);
return sitesList.sites;
}
//main build and screen layout
@override
Widget build(BuildContext context) {
print("BUILD LAYOUT");
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.cyan,
),
home: Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
leading: Icon(Icons.ac_unit),
title: Text("SnoTel Map"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.favorite),
onPressed: () {
debugPrint("Favorites");
},
),
IconButton(
icon: Icon(Icons.feedback),
onPressed: () {
debugPrint("Message sent");
},
),
],
),
body: _MapWidget()),
);
}
}
const _MapWidget({this.marker});
final List<Marker> marker;
...
body: _MapWidget(marker: marker)),
_MapWidget中的更改:
class _MapDataState extends State<MapData> {
List<SitesList> sl = [];
List<SnoTelSite> sts = [];
var marker = <Marker>[];
_MapDataState(){
print("map data state");
loadSites().then((sitesdata) {
print('Loaded Sites Asset JSON');
//clone sitesdata into sts array
sts..addAll(sitesdata);
sts.forEach((s) {
marker.add(
Marker(
point: new LatLng(double.parse(s.lat),double.parse(s.lng)),
builder: (ctx) => _MarkerPopUp(sitename: s.name, siteelevation: s.elevation, siteid: s.siteID,),
),
);
});
});
}
// @override
// initState() {
// print("INIT STATE");
// super.initState();
// }
//local load assets ... constants hold path snotelsitesjson
Future<String> _loadSiteAssets() async {
return await rootBundle.loadString(snotelsitesjson);
}
Future loadSites() async {
String jsonString = await _loadSiteAssets();
final jsonResponse = json.decode(jsonString);
SitesList sitesList = new SitesList.fromJson(jsonResponse);
return sitesList.sites;
}
//main build and screen layout
@override
Widget build(BuildContext context) {
print("BUILD LAYOUT");
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.cyan,
),
home: Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
leading: Icon(Icons.ac_unit),
title: Text("SnoTel Map"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.favorite),
onPressed: () {
debugPrint("Favorites");
},
),
IconButton(
icon: Icon(Icons.feedback),
onPressed: () {
debugPrint("Message sent");
},
),
],
),
body: _MapWidget()),
);
}
}
const _MapWidget({this.marker});
final List<Marker> marker;
...
body: _MapWidget(marker: marker)),
const\u MapWidget({this.marker});
最终列表标记;
...
正文:_MapWidget(marker:marker)),
首先,更改此选项:
\u MapDataState(){
loadSites()。然后((sitesdata){
打印(“加载的站点资产JSON”);
//将sitesdata克隆到sts阵列中
sts..addAll(站点数据);
圣弗雷赫(s){
marker.add(
标记(
要点:新的LatLng(double.parse(s.lat),double.parse(s.lng)),
生成器:(ctx)=>\u MarkerPopUp(站点名称:s.name,站点高程:s.elevation,站点ID:s.siteid,),
),
);
});
});
}
从构造函数到initState()
:
@覆盖
initState(){
打印(“初始状态”);
super.initState();
loadSites()。然后((sitesdata){
打印(“加载的站点资产JSON”);
//将sitesdata克隆到sts阵列中
sts..addAll(站点数据);
圣弗雷赫(s){
marker.add(
标记(
要点:新的LatLng(double.parse(s.lat),double.parse(s.lng)),
生成器:(ctx)=>\u MarkerPopUp(站点名称:s.name,站点高程:s.elevation,站点ID:s.siteid,),
),
);
});
});
}
然后,添加一个setState((){})代码>此处:
sts.forEach((s){
marker.add(
标记(
要点:新的LatLng(double.parse(s.lat),double.parse(s.lng)),
生成器:(ctx)=>\u MarkerPopUp(站点名称:s.name,站点高程:s.elevation,站点ID:s.siteid,),
),
);
});
setState((){});
出于对理解代码的好奇,MapData
类中有什么?在\u MarkerPopUp
中?
我对飞舞和飞镖很陌生,我试着去理解。您的完整代码是否在某处可用?
谢谢,您好,谢谢您的指导。我能够使用setState((){})更新代码;类似于:setState((){marker=marker;});然后我把标记传递给我的_MapWidget。听起来对吗?它正在显示标记,只是想确保这是最有效的方法。嗨,MapData是我的类,包含名称、lat、lng等_MarkerPopUp只是函数中的标记生成器。更多信息,请参阅。