我正在呼叫一個回傳XML資料的 API
我有一個資料類來獲取我需要的部分資料。
API 回傳instances罰款,但我無法提取資料串列,然后我需要呼叫一個函式(經過測驗并且可以作業)來放置一個map marker.
我需要lat, long從回傳的串列中取出vehicleactivity并使用它
這是班級
import 'package:xml/xml.dart';
class VehicleActivity {
VehicleActivity({
this.recordedAtTime,
this.itemIdentifier,
this.validUntilTime,
this.longitude,
this.latitude,
});
DateTime? recordedAtTime;
String? itemIdentifier;
DateTime? validUntilTime;
double? longitude;
double? latitude;
factory VehicleActivity.fromElement(XmlElement vaElement) => VehicleActivity(
recordedAtTime: DateTime.parse(
vaElement.findElements('RecordedAtTime').first.text,
),
itemIdentifier: vaElement.findElements('ItemIdentifier').first.text,
validUntilTime: DateTime.parse(
vaElement.findElements('ValidUntilTime').first.text,
),
longitude:
double.tryParse(vaElement.findAllElements('Longitude').first.text),
latitude:
double.tryParse(vaElement.findAllElements('Latitude').first.text),
);
}
我用這個 API fetch 呼叫它
Future <VehicleActivity?> fetchLiveLocations() async {
var client = http.Client();
VehicleActivity? vehicleActivity;
try{
var response = await client.get(Uri.parse(
'https_call'));
if (response.statusCode == 200) {
final doc = XmlDocument.parse(utf8.decode(response.bodyBytes));
final vehicleActivity = doc
.findAllElements('VehicleActivity')
.map((e) => VehicleActivity.fromElement(e))
.toList();
print(vehicleActivity);
}
} catch(e) {
print("Exception Happened: ${e.toString()}");
}
return vehicleActivity;
}
然后繪制我使用這個函式的標記,這就是問題所在。
Future<void> showMapMarkers() async {
_unTiltMap();
var vehicleActivity = await fetchLiveLocations();
for (VehicleActivity vehicleActivity in vehicleActivity!) {
GeoCoordinates geoCoordinates = GeoCoordinates (vehicleActivity.latitude, vehicleActivity.latitude);
_addMapMarker(geoCoordinates, 1);
}
}
這是問題
The type 'VehicleActivity' used in the 'for' loop must implement Iterable.
在這條線上
for (VehicleActivity vehicleActivity in vehicleActivity!) {
更新 - 繪圖功能無法識別(我for為我的 Json 使用了一種方法,這可能是問題,但嘗試了其他選項)
Future<void> showMapMarkers() async {
_unTiltMap();
var vehicleActivity = await fetchLiveLocations();
for (VehicleActivity vehicleActivity in vehicleActivity!) {
GeoCoordinates geoCoordinates = GeoCoordinates (vehicleActivity.latitude, vehicleActivity.latitude);
_addMapMarker(geoCoordinates, 1);
}
}
uj5u.com熱心網友回復:
處理評論中的問題:
- 它實際上應該回傳一個串列(注意
toList()) - 它應該在例外或非 200 時回傳一些東西(不是 null - 至少現在)
將此方法重寫為:
Future<List<VehicleActivity>> fetchLiveLocations() async {
var client = http.Client();
try {
var response = await client.get(Uri.parse('https_call'));
if (response.statusCode == 200) {
final doc = XmlDocument.parse(utf8.decode(response.bodyBytes));
return doc
.findAllElements('VehicleActivity')
.map((e) => VehicleActivity.fromElement(e))
.toList();
} else {
// todo - fix later - for now return empty list
return <VehicleActivity>[];
}
} catch (e) {
print('Exception Happened: ${e.toString()}');
// todo - fix later - for now return empty list
return <VehicleActivity>[];
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/418194.html
標籤:
