json - Eroor : 输入 '_InternalLinkedHashMap' 不是类型 'List 的子类型' 在类型转换中
问题描述
我是 Flutter 的新手,我尝试在“10.0.2.2:8000/api/membres”上从我的 api 获取数据,但出现错误,例如类型 List dynamic is not a subtype of type 'List. 我正在关注颤振的例子: https ://flutter.dev/docs/cookbook/networking/fetch-data#complete-example
请帮助我遵循有用的教程并告诉我如何修复此代码。
我的主页.dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:http/http.dart' as http;
import 'dart:convert';
class MyHomePage extends StatefulWidget {
const MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
static const url = "10.0.2.2:8000/api/membres";
Future<List<Map<String, dynamic>>> _future;
@override
void initState() {
super.initState();
_future = fetch();
}
Future<List<Map<String, dynamic>>> fetch() {
return http
.get("http://10.0.2.2:8000/api/membres")
.then((response) {
return response.statusCode == 200
? response.body
: throw 'Error when getting data';
})
.then((body) => json.decode(body)) //
.then((list) => (list as List).cast<Map<String, dynamic>>());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
),
body: RefreshIndicator(
onRefresh: () async {
_future = fetch();
setState(() {});
return _future;
},
child: FutureBuilder<List<Map<String, dynamic>>>(
future: _future,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(
child: Container(
constraints: BoxConstraints.expand(),
child: SingleChildScrollView(
physics: AlwaysScrollableScrollPhysics(),
child: Text(snapshot.error.toString()),),),);}
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);}
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
final item = snapshot.data[index];
return ListTile(
title: Text(item['nom']),
subtitle: Text(item['prenom']),
);
},
);
},
),
),
);
}
}
我用 Postman 测试了 API,它可以工作:
在模拟器中:
解决方案
你有几个问题...
fetch
您可能应该通过以下方式进行整理async
:
Future<Map<String, dynamic>> fetch() async {
http.Response response = await http.get('http://10.0.2.2:8000/api/membres');
if (response.statusCode != 200) return null;
return json.decode(response.body);
}
如果您查看您在邮递员中获得的 json,您会看到最上面的项目是一张地图 - 至少有一个 key membres
。该键似乎包含其他地图的列表。从您的类型来看,您希望获得该列表。
如果该假设是正确的,您可以按如下方式对其进行调整:
Future<List<Map<String, dynamic>>> fetch() async {
http.Response response = await http.get('http://10.0.2.2:8000/api/membres');
if (response.statusCode != 200) return null;
return List<Map<String, dynamic>>.from(json.decode(response.body)['membre']);
}
推荐阅读
- python - 加快读取/散列数百万个文件/图像
- html - 如何使用宏功能进行多个
在带有 xPath 的 xml 中?
- json - 如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?
- ios - NSURLErrorDomain Code=-1005 "网络连接丢失。", _kCFStreamErrorCodeKey=54
- html - 如何在导航栏中间对齐项目?
- mongodb - 按字段分组并计数 mongodb
- sql - 使用 Laravel Eloquent 一次返回多个表列和另一列的总和
- android - Android-studio 布局预览工具如何准确处理“@+id”和“@id”?
- python-3.x - 哪种方法 dm 或 dbow 适用于使用 Doc2Vec 的文档相似性?
- c# - 多次调用 File.AppendAllLines 并在 Visual Studio 中打开文件时出现间歇性文件锁定异常