Json Eroor:Type'_内部链接dhashmap<;字符串,动态>';不是类型为';列表<;动态>';内铸

Json Eroor:Type'_内部链接dhashmap<;字符串,动态>';不是类型为';列表<;动态>';内铸,json,rest,api,flutter,Json,Rest,Api,Flutter,我不熟悉flifter,我尝试从“10.0.2.2:8000/api/membres”上的api获取数据,但出现了错误,比如类型列表dynamic不是类型列表的子类型。 下面是颤振的例子: 请帮助我遵循一个有用的教程,并告诉我如何修复此代码 我的主页 import 'package:flutter/material.dart'; import 'dart:async'; import 'package:http/http.dart' as http; import 'dart:convert';

我不熟悉flifter,我尝试从“10.0.2.2:8000/api/membres”上的api获取数据,但出现了错误,比如类型列表dynamic不是类型列表的子类型。 下面是颤振的例子:

请帮助我遵循一个有用的教程,并告诉我如何修复此代码

我的主页

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']),
                );
              },
            );
          },
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“dart:async”;
将“package:http/http.dart”导入为http;
导入“dart:convert”;
类MyHomePage扩展StatefulWidget{
constmyhomepage({Key}):超级(Key:Key);
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
静态常量url=“10.0.2.2:8000/api/membres”;
未来,未来;;
@凌驾
void initState(){
super.initState();
_future=fetch();
}
未来获取(){
返回http
.get(“http://10.0.2.2:8000/api/membres")
.然后((回应){
return response.statusCode==200
?响应。主体
:抛出“获取数据时出错”;
})
.then((body)=>json.decode(body))//
.then((list)=>(列表为list.cast());
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“主页”),
),
正文:刷新指示器(
onRefresh:()异步{
_future=fetch();
setState((){});
回归未来;
},
孩子:未来建设者(
未来:未来,
生成器:(上下文,快照){
if(snapshot.hasError){
返回中心(
子:容器(
约束:BoxConstraints.expand(),
子:SingleChildScrollView(
物理:AlwaysScrollableScrollPhysics(),
子项:文本(snapshot.error.toString(),),),;}
如果(!snapshot.hasData){
返回中心(
子对象:CircularProgressIndicator(),
);}
返回ListView.builder(
itemCount:snapshot.data.length,
itemBuilder:(构建上下文,int索引){
最终项目=快照。数据[索引];
返回列表块(
标题:文本(项目[‘名称]),
字幕:文本(项目['prenom']),
);
},
);
},
),
),
);
}
}
我用Postman测试了API,它可以工作:

这就是错误:

在模拟器中:


您有几个问题

您可能应该通过使
异步
来整理
获取

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);
}

OMG,终于可以用了谢谢你Aloooot,但是你能给我解释一下上面这部分代码和问题所在吗?基本上,JSON中的任何东西都是一个映射(JSON规范中的对象)、一个列表(JSON规范中的数组)或一个值。当您调用
json.decode
时,根据json的内容,返回的内容可能是
列表
,也可能是
映射
。当你在解码的地图/列表中穿行时,你会发现更多这样的动态事物,它们可能是其中之一。您的json肯定在顶部有一个映射,它的值是一个列表。您通过键
['keyName']
索引来获得它的值,但这会给您一个
列表
,您可以使用
列表进行转换。您试图从
将来自json的顶级映射添加到一个列表中,但它不是一个列表,而是一个映射。它的成员
membre
是一个列表。(不是双关语:member/membre!)好的,很清楚,你的意思是当有一个像“membre”这样的键时,我需要使用map,然后使用列表?是的,如果你的json文本像在本例中那样说:
{“membre”:[{“id”:“56”},{“id”:“57”}}
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']);
}