Flutter 在Flatter中从internet获取json数据时出现问题

Flutter 在Flatter中从internet获取json数据时出现问题,flutter,Flutter,我是一个新手,当时正在运行一个从互联网上获取和显示数据的代码。但当我运行代码时,我会遇到以下错误: List'不是“Map”类型的子类型。 我试图找出解决办法,但没有任何帮助。提前谢谢 这是我的密码: import 'package:flutter/material.dart'; import 'dart:async'; import 'package:http/http.dart' as http; class Message extends StatefulWidget { @ove

我是一个新手,当时正在运行一个从互联网上获取和显示数据的代码。但当我运行代码时,我会遇到以下错误:
List'不是“Map”类型的子类型
。 我试图找出解决办法,但没有任何帮助。提前谢谢

这是我的密码:

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:http/http.dart' as http;


class Message extends StatefulWidget {
  @override
  _MessageState createState() => _MessageState();
}

class _MessageState extends State<Message> {
  Map data;
  List userData;
  Future getData() async
  {
    http.Response response = await http.get('https://jsonplaceholder.typicode.com/users');

    data = json.decode(response.body);

    setState(() {
     userData = data["data"];
    });

  }

  @override
  void initState(){
    super.initState();
    getData();
  }
  @override
  Widget build(BuildContext context) {
    return Container(
          child:ListView.builder
          (
            shrinkWrap: true,
            itemCount: userData == null ? 0 : userData.length,
              itemBuilder:(BuildContext context, int index){
                return Row(
                  children:<Widget>[

                Text('${userData[index]["username"]}', style: TextStyle(fontWeight: FontWeight.w600, fontSize: 20),),
                Text('${userData[index]["catchPhrase"]}',style: TextStyle(fontWeight: FontWeight.w500, fontSize: 17),),
                Icon(Icons.navigate_next)
                  ]
                  );
                   }

          )
    );
  }
}```
导入“包装:颤振/材料.省道”;
导入“dart:async”;
将“package:http/http.dart”导入为http;
类消息扩展StatefulWidget{
@凌驾
_MessageState createState()=>\u MessageState();
}
类_MessageState扩展状态{
地图数据;
列出用户数据;
Future getData()异步
{
http.Response-Response=等待http.get('https://jsonplaceholder.typicode.com/users');
data=json.decode(response.body);
设置状态(){
用户数据=数据[“数据”];
});
}
@凌驾
void initState(){
super.initState();
getData();
}
@凌驾
小部件构建(构建上下文){
返回容器(
子项:ListView.builder
(
收缩膜:对,
itemCount:userData==null?0:userData.length,
itemBuilder:(构建上下文,int索引){
返回行(
儿童:[
文本(“${userData[index][“username”]}”,样式:TextStyle(fontWeight:fontWeight.w600,fontSize:20),
文本(“${userData[index][“catchPhrase”]}”,样式:TextStyle(fontWeight:fontWeight.w500,fontSize:17),
图标(图标。导航到下一步)
]
);
}
)
);
}
}```

发生的事情是
数据[“数据”]
是一个地图而不是列表。 尝试按照错误日志中的说明将类型更改为映射

你能试试下面的吗

import 'dart:async';
import 'package:http/http.dart' as http;


class Message extends StatefulWidget {
  @override
  _MessageState createState() => _MessageState();
}

class _MessageState extends State<Message> {
  Map data;
  Map<String, dynamic> userData;
  Future getData() async
  {
    http.Response response = await http.get('https://jsonplaceholder.typicode.com/users');

    data = json.decode(response.body);

    setState(() {
     userData = data["data"];
    });

  }

  @override
  void initState(){
    super.initState();
    getData();
  }
  @override
  Widget build(BuildContext context) {
    return Container(
          child:ListView.builder
          (
            shrinkWrap: true,
            itemCount: userData == null ? 0 : userData.length,
              itemBuilder:(BuildContext context, int index){
                return Row(
                  children:<Widget>[
                    Text('${userData[userData.keys.toList()[index]]["username"]}', style: TextStyle(fontWeight: FontWeight.w600, fontSize: 20),),
                    Text('${userData[userData.keys.toList()[index]]["catchPhrase"]}',style: TextStyle(fontWeight: FontWeight.w500, fontSize: 17),),
                    Icon(Icons.navigate_next)
                  ]);
              }

          )
    );
  }
}
导入'dart:async';
将“package:http/http.dart”导入为http;
类消息扩展StatefulWidget{
@凌驾
_MessageState createState()=>\u MessageState();
}
类_MessageState扩展状态{
地图数据;
地图用户数据;
Future getData()异步
{
http.Response-Response=等待http.get('https://jsonplaceholder.typicode.com/users');
data=json.decode(response.body);
设置状态(){
用户数据=数据[“数据”];
});
}
@凌驾
void initState(){
super.initState();
getData();
}
@凌驾
小部件构建(构建上下文){
返回容器(
子项:ListView.builder
(
收缩膜:对,
itemCount:userData==null?0:userData.length,
itemBuilder:(构建上下文,int索引){
返回行(
儿童:[
文本('${userData[userData.keys.toList()[index]][“username”]}',样式:TextStyle(fontWeight:fontWeight.w600,fontSize:20),
文本(“${userData[userData.keys.toList()[index]][”标语“]}”,样式:TextStyle(fontWeight:fontWeight.w500,fontSize:17),
图标(图标。导航到下一步)
]);
}
)
);
}
}

这是您的操作方式:

  • 定义一个模型类
  • Define.fromJson方法
  • 获取数据
  • 将数据传递给模型,创建实例并制作列表
  • 例如:

    型号:

    class User {
    final int id;
    ...
    
    User({
    @required this.id
    ...
    })
    
    User.fromJson(Map json)
    : this.id = json["id"]
    ...
    
    您在网络调用中使用此模型,如下所示:

    Map<String, dynamic> response = await http.get(...)
    
    
    List<User> users = (response as List)
        .map((element) => User.fromJson(element))
        .toList();
    
    Map response=wait http.get(…)
    列表用户=(响应为列表)
    .map((元素)=>User.fromJson(元素))
    .toList();
    

    注意:我直接用SO编写了这段代码(它不是经过单元测试的。您可能需要做一些调整才能使其正常工作)

    请发布您从API获得的完整json字符串。您解决问题了吗?