类型 'List<dynamic>' 不是类型 'FutureOr<List<RideData>>' 的子类型,Flutter
Type 'List<dynamic>' is not a subtype of type 'FutureOr<List<RideData>>', Flutter
我正在调用 API,但我一直在尝试正确解析此 JSON
响应,但未能解决此问题。我调用 API,并想用 FutureBuilder
和 Provider
显示数据,但我收到错误 Type 'List<dynamic>' is not a subtype of type 'FutureOr<List<RideData>>'
,我不确定我做错了什么.代码如下:
API 通话:
Future<List<RideData>> getRides() async {
final response = await HTTP.apiRequest(Method.GET, '/rides');
final data = jsonDecode(response.body)['data'];
return data;
}
我要显示数据的 Future 构建器:
Future<List<RideData>> _getRideStreamList() async {
final _vehicleStreamData = await APICall.instance.getRides();
var provider = Provider.of<RideStore>(context, listen: false);
provider.setVehicleList(_vehicleStreamData, notify: false);
return _vehicleStreamData;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
children: [
Container(
height: 1000,
child: FutureBuilder<List<RideData>>(
future: _getRideStreamList(),
builder: (context, snapshot) {
if (snapshot.hasData) {
Consumer<RideStore>(
builder: (context, rideData, child) {
return ListView.builder(
shrinkWrap: true,
itemCount: rideData.rideList.length,
itemBuilder: (context, index) {
RideData rides = rideData.getRideByIndex(index);
return Text('${rides.rideId}');
},
);
},
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return Container();
},
),
),
],
),
),
),
);
}
我几乎可以肯定 API 调用和响应存在问题,因为我没有正确解析 JSON 数据,但也许我错了,还有其他问题。 ..
这一行
final data = jsonDecode(response.body)['data'];
您正在获取数据并对其进行解码,它 return 是一个映射或字符串,而不是任何列表或任何模型....您应该先创建一个 RideData 列表,然后 return 它
你可以按照这个方法
List<RideData> list = List<RideData>();
if (response.data != null) {
list = data.map((item) => RideData.fromJson(item)).toList();
}
return list;
}
然后制作 RideData 的模型 class
Future<List<RideData>> getRides() async {
final response = await HTTP.apiRequest(Method.GET, '/rides');
List<dynamic> data = jsonDecode(response.body)['data'];
List<YourModelClass> list = [];
if (response.data != null) {
list = data.map((item) => YourModelClass.fromJson(item)).toList();
}
return list;
}
您可以生成模型class
https://javiercbk.github.io/json_to_dart/
而且,除了指出的其他问题之外,您还这样做了:
future: _getRideStreamList(),
Never never never build 你正在观看的未来是构建 FutureBuilder 的一部分。无限循环!阅读 FutureBuilder 的文档,尤其要注意第二和第三段。 StreamBuilder 也是如此。我有一个关于那个的视频 https://www.youtube.com/watch?v=sqE-J8YJnpg 来说明为什么文档不会说谎。
我正在调用 API,但我一直在尝试正确解析此 JSON
响应,但未能解决此问题。我调用 API,并想用 FutureBuilder
和 Provider
显示数据,但我收到错误 Type 'List<dynamic>' is not a subtype of type 'FutureOr<List<RideData>>'
,我不确定我做错了什么.代码如下:
API 通话:
Future<List<RideData>> getRides() async {
final response = await HTTP.apiRequest(Method.GET, '/rides');
final data = jsonDecode(response.body)['data'];
return data;
}
我要显示数据的 Future 构建器:
Future<List<RideData>> _getRideStreamList() async {
final _vehicleStreamData = await APICall.instance.getRides();
var provider = Provider.of<RideStore>(context, listen: false);
provider.setVehicleList(_vehicleStreamData, notify: false);
return _vehicleStreamData;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
children: [
Container(
height: 1000,
child: FutureBuilder<List<RideData>>(
future: _getRideStreamList(),
builder: (context, snapshot) {
if (snapshot.hasData) {
Consumer<RideStore>(
builder: (context, rideData, child) {
return ListView.builder(
shrinkWrap: true,
itemCount: rideData.rideList.length,
itemBuilder: (context, index) {
RideData rides = rideData.getRideByIndex(index);
return Text('${rides.rideId}');
},
);
},
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return Container();
},
),
),
],
),
),
),
);
}
我几乎可以肯定 API 调用和响应存在问题,因为我没有正确解析 JSON 数据,但也许我错了,还有其他问题。 ..
这一行
final data = jsonDecode(response.body)['data'];
您正在获取数据并对其进行解码,它 return 是一个映射或字符串,而不是任何列表或任何模型....您应该先创建一个 RideData 列表,然后 return 它
你可以按照这个方法
List<RideData> list = List<RideData>();
if (response.data != null) {
list = data.map((item) => RideData.fromJson(item)).toList();
}
return list;
}
然后制作 RideData 的模型 class
Future<List<RideData>> getRides() async {
final response = await HTTP.apiRequest(Method.GET, '/rides');
List<dynamic> data = jsonDecode(response.body)['data'];
List<YourModelClass> list = [];
if (response.data != null) {
list = data.map((item) => YourModelClass.fromJson(item)).toList();
}
return list;
}
您可以生成模型class https://javiercbk.github.io/json_to_dart/
而且,除了指出的其他问题之外,您还这样做了:
future: _getRideStreamList(),
Never never never build 你正在观看的未来是构建 FutureBuilder 的一部分。无限循环!阅读 FutureBuilder 的文档,尤其要注意第二和第三段。 StreamBuilder 也是如此。我有一个关于那个的视频 https://www.youtube.com/watch?v=sqE-J8YJnpg 来说明为什么文档不会说谎。