Flutter:将 Future<List<dynamic>> 转换为 List 类型以与 Google_maps_flutter 包一起使用以输出标记
Flutter: Converting Future<List<dynamic>> to List type for use with Google_maps_flutter Package to output Markers
我正在编写一个应用程序,它通过 HTTP 请求提取房地产列表的日期。
我使用 future 和 package:http/http.dart 得到一个 json 数组
Future<List<dynamic>> fetchJson() async {
final response = await http.get('https://brettransley.com/single.json');
return parseHomes(response.body);
}
List<Properties> parseHomes(String responseBody) {
final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<Properties>((json) => Properties.fromJson(json)).toList();
}
我可以通过一个属性Class成功拉取数据并映射。 Future List 可用于使用 FutureBuilder 输出小部件。
final allhomes = fetchJson();
FutureBuilder<List>(
future: allhomes,
builder: (BuildContext jsoncontext, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return (Center(child: CircularProgressIndicator()));
} else {
return (Container(
child: ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (BuildContext homecontext, index) {
final home = snapshot.data[index];
return buildHome(context, home);
},
),
));
}
},
),
我的问题是我想使用 FutureList 中的数据输出地图标记,使用“Google_Map_flutter" 插件
我的地图代码在这里:
GoogleMap(
zoomGesturesEnabled: true,
mapType: MapType.hybrid,
onMapCreated: _onMapCreated,
// markers:
initialCameraPosition: CameraPosition(
target: _center,
zoom: 15.0,
),
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>[
new Factory<OneSequenceGestureRecognizer>(
() => new EagerGestureRecognizer(),
),
].toSet(),
markers: Set.from(getGeoCords()),
),
为了输出标记,我需要 getGeoCords() 函数到 return 列表,但是我的数据在 FutureList 中,我可以 运行 通过并按照此处的尝试创建和排列:
getGeoCords() {
final List homemarkers = [];
allhomes.then((value) {
value.forEach((element) {
print(element);
homemarkers.add(
Marker(
markerId: MarkerId('myMarker'),
draggable: false,
onTap: () {
print('Marker Tapped');
},
position:
LatLng(double.parse(element.lat), double.parse(element.long)),
),
);
});
});
return homemarkers;
}
该函数成功创建了一个我可以使用的列表,但是因为我们使用的是 Future,该函数什么都没有 return.. 直到 google 映射之后负载.
任何人都可以帮助我将 FutureList 转换为列表的解决方案,该列表可以与 google_map_flutter 插件一起使用。
我是 Flutter 的新手,所以我对它的整体运作方式的理解可能存在差距..
您可以将 GoogleMap
小部件包装在 FutureBuilder
中,当未来解决时,您将拥有 Marker
个对象的 List
作为 snapshot.data
就像您在代码的另一部分为 ListView.builder
所做的那样。
好的,所以我想通了,在 Future Builder 中构建它之后它似乎工作了。
代码在这里:
FutureBuilder(
future: allhomes,
builder: (BuildContext jsoncontext, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return (Center(child: CircularProgressIndicator()));
} else {
// List<dynamic> parsedJson = jsonDecode(snapshot.data);
allMarkers = snapshot.data.map((element) {
return Marker(
markerId: MarkerId(element.address),
draggable: false,
onTap: () {
print('Marker Tapped');
},
position: LatLng(double.parse(element.lat),
double.parse(element.long)),
);
}).toList();
return SizedBox(
width: 200,
height: 450,
child: GoogleMap(
zoomGesturesEnabled: true,
mapType: MapType.hybrid,
onMapCreated: _onMapCreated,
// markers:
initialCameraPosition: CameraPosition(
target: _center,
zoom: 15.0,
),
gestureRecognizers:
<Factory<OneSequenceGestureRecognizer>>[
new Factory<OneSequenceGestureRecognizer>(
() => new EagerGestureRecognizer(),
),
].toSet(),
markers: Set.from(allMarkers),
),
);
}
},
),
我正在编写一个应用程序,它通过 HTTP 请求提取房地产列表的日期。
我使用 future 和 package:http/http.dart 得到一个 json 数组
Future<List<dynamic>> fetchJson() async {
final response = await http.get('https://brettransley.com/single.json');
return parseHomes(response.body);
}
List<Properties> parseHomes(String responseBody) {
final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<Properties>((json) => Properties.fromJson(json)).toList();
}
我可以通过一个属性Class成功拉取数据并映射。 Future List 可用于使用 FutureBuilder 输出小部件。
final allhomes = fetchJson();
FutureBuilder<List>(
future: allhomes,
builder: (BuildContext jsoncontext, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return (Center(child: CircularProgressIndicator()));
} else {
return (Container(
child: ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (BuildContext homecontext, index) {
final home = snapshot.data[index];
return buildHome(context, home);
},
),
));
}
},
),
我的问题是我想使用 FutureList 中的数据输出地图标记,使用“Google_Map_flutter" 插件
我的地图代码在这里:
GoogleMap(
zoomGesturesEnabled: true,
mapType: MapType.hybrid,
onMapCreated: _onMapCreated,
// markers:
initialCameraPosition: CameraPosition(
target: _center,
zoom: 15.0,
),
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>[
new Factory<OneSequenceGestureRecognizer>(
() => new EagerGestureRecognizer(),
),
].toSet(),
markers: Set.from(getGeoCords()),
),
为了输出标记,我需要 getGeoCords() 函数到 return 列表,但是我的数据在 FutureList 中,我可以 运行 通过并按照此处的尝试创建和排列:
getGeoCords() {
final List homemarkers = [];
allhomes.then((value) {
value.forEach((element) {
print(element);
homemarkers.add(
Marker(
markerId: MarkerId('myMarker'),
draggable: false,
onTap: () {
print('Marker Tapped');
},
position:
LatLng(double.parse(element.lat), double.parse(element.long)),
),
);
});
});
return homemarkers;
}
该函数成功创建了一个我可以使用的列表,但是因为我们使用的是 Future,该函数什么都没有 return.. 直到 google 映射之后负载.
任何人都可以帮助我将 FutureList 转换为列表的解决方案,该列表可以与 google_map_flutter 插件一起使用。
我是 Flutter 的新手,所以我对它的整体运作方式的理解可能存在差距..
您可以将 GoogleMap
小部件包装在 FutureBuilder
中,当未来解决时,您将拥有 Marker
个对象的 List
作为 snapshot.data
就像您在代码的另一部分为 ListView.builder
所做的那样。
好的,所以我想通了,在 Future Builder 中构建它之后它似乎工作了。
代码在这里:
FutureBuilder(
future: allhomes,
builder: (BuildContext jsoncontext, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return (Center(child: CircularProgressIndicator()));
} else {
// List<dynamic> parsedJson = jsonDecode(snapshot.data);
allMarkers = snapshot.data.map((element) {
return Marker(
markerId: MarkerId(element.address),
draggable: false,
onTap: () {
print('Marker Tapped');
},
position: LatLng(double.parse(element.lat),
double.parse(element.long)),
);
}).toList();
return SizedBox(
width: 200,
height: 450,
child: GoogleMap(
zoomGesturesEnabled: true,
mapType: MapType.hybrid,
onMapCreated: _onMapCreated,
// markers:
initialCameraPosition: CameraPosition(
target: _center,
zoom: 15.0,
),
gestureRecognizers:
<Factory<OneSequenceGestureRecognizer>>[
new Factory<OneSequenceGestureRecognizer>(
() => new EagerGestureRecognizer(),
),
].toSet(),
markers: Set.from(allMarkers),
),
);
}
},
),