当前位置: 首页 > 知识库问答 >
问题:

类型\u InternalLinkedHashMap不是类型列表的子类型

司马建柏
2023-03-14

我正在尝试使用网络调用实现一个简单的新闻提要应用程序,其中屏幕将在列表视图中显示最新的故事。

在当前代码中,我从API获得了一个响应(因为我在日志中看到了整个响应主体),但似乎无法在UI中显示数据。我得到这个错误:

类型_InternalLinkedHashMap

这是JSON结构

{
    "response": {
        "status": "ok",
        "userTier": "developer",
        "total": 25095,
        "startIndex": 1,
        "pageSize": 10,
        "currentPage": 1,
        "pages": 2510,
        "orderBy": "relevance",
        "results": [
          {
            "id": "australia-news/2018/aug/13/turnbulls-energy-policy-hangs-in-the-balance-as-euthanasia-debate-given-precedence",
            "type": "article",
            "sectionId": "australia-news",
            "sectionName": "Australia news",
            "webPublicationDate": "2018-08-12T18:00:08Z",
            "webTitle": "Energy policy hangs in balance, as Senate debates euthanasia",
            "webUrl": "https://www.theguardian.com/australia-news/2018/aug/13/turnbulls-energy-policy-hangs-in-the-balance-as-euthanasia-debate-given-precedence",
            "apiUrl": "https://content.guardianapis.com/australia-news/2018/aug/13/turnbulls-energy-policy-hangs-in-the-balance-as-euthanasia-debate-given-precedence",
            "isHosted": false,
            "pillarId": "pillar/news",
            "pillarName": "News"
        }, {
            "id": "media/2018/jun/13/the-rev-colin-morris-obituary-letter",
            "type": "article",
            "sectionId": "media",

根据我的理解,我只想首先在列表中显示webTitle,然后添加其他字段(在我清楚地理解网络概念之后),但得到上面提到的错误。这是我的完整代码:

class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {

    return new MaterialApp(
      title: 'Network Example',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new Scaffold(
        appBar: AppBar(
          title: new Text('Network Example'),
        ),
        body: new Container(
          child: new FutureBuilder<List<News>> (
            future: fetchNews(),
            builder: (context, snapshot) {

              if (snapshot.hasData) {
                return new ListView.builder(
                    itemCount: snapshot.data.length,
                    itemBuilder: (context, index) {
                      return new Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            new Text(snapshot.data[index].newsTitle,
                                style: new TextStyle(
                                    fontWeight: FontWeight.bold)
                            ),
                            new Divider()
                          ],
                      );
                    }
                );
              } else if (snapshot.hasError) {
                return new Text("${snapshot.error}");
              }
              return CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }


Future<List<News>> fetchNews() async {
  final response = await http.get('https://content.guardianapis.com/search?q=debates&api-key=');
  print(response.body);
  List responseJson = json.decode(response.body.toString());
  List<News> newsTitle = createNewsList(responseJson);
  return newsTitle;

}

List<News> createNewsList(List data) {
    List<News> list = new List();
    for (int i = 0; i< data.length; i++) {
      String title = data[i]['webTitle'];

      News news = new News(
      newsTitle: title);
      list.add(news);
    }
    return list;

  }
}

class News {
 final String newsTitle;

  News({this.newsTitle});

  factory News.fromJson(Map<String, dynamic> json) {

    return new News(
      newsTitle: json['webTitle'],
    );
  }
}

我以前看过类似的问题,也看过json结构的文章,但似乎不知道如何解决这个问题。

共有3个答案

阳宗清
2023-03-14

Mybe你可以尝试修改这个方法,像这样:

Future<List<News>> fetchNews() async {
  final response = await http.get('https://content.guardianapis.com/search?q=debates&api-key=');
  print(response.body);
  List responseJson = json.decode(response.body.result);
  List<News> newsTitle = createNewsList(responseJson);
  return newsTitle;

}
滕无尘
2023-03-14
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:cricket/cric.dart';

void main() async{
  List st=await getmatches();
  runApp(cric(st));
}

class cric extends StatelessWidget{

  List st;
  cric(this.st);
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      theme: ThemeData(
        primaryColor: Colors.deepPurpleAccent
      ),
      home: cricket(st),
    );
  }
}

Future<List> getmatches() async{
 /* String url="https://cricapi.com/api/cricketScore?apikey=oJmzPtpZJXcIQmxAjOlP5Zss1At1&unique_id=1034809";
  http.Response response=await http.get(url);
  return jsonDecode(response.body);*/
 // print(Utf8Codec().decode((response.bodyBytes)));
  //return Utf8Codec().decode(response.bodyBytes);
 //print (utf8.decode(response.bodyBytes));
  var response= await http.get(Uri.encodeFull('https://cricapi.com/api/matches?apikey=oJmzPtpZJXcIQmxAjOlP5Zss1At1'),
  headers:{
    "Accept": "application/json",
    "X-Api-Key": "oJmzPtpZJXcIQmxAjOlP5Zss1At1",
  });
  //return json.decode(response.body);
  print(Utf8Codec().decode((response.bodyBytes)));

}//iam also having the same error
郏志学
2023-03-14

问题是,您的JSON不是一个数组。它是一个对象。但是你试图用它作为一个数组。

您可能需要将createNewsList调用更改为以下内容:

List responseJson = json.decode(response.body.toString());
List<News> newsTitle = createNewsList(responseJson["response"]["results"]);
 类似资料:
  • 我正在对地图执行firestore查询 没有人工作过,任何帮助都是感激的 谢谢你抽出时间

  • 我是颤振初学者。我得到这样的JSON响应时出错。 我一直在论坛上寻找这个问题,我发现是这样的。 但我不懂如何编写函数。这是我的密码。 还有像这样的错误。 我很抱歉问了同样的问题,因为我不明白

  • 我有点被某些情况困住了。 1)

  • 我试图从API获取数据。我得到了错误类型列表不是地图的子类型。我是新来的,不明白我在哪里犯了错误。 这是我的回帖功能: 在我的主屏幕中,我使用了一个,如下所示: 如何解决此错误?提前谢谢。

  • 我对Flutter编程非常陌生,我正在尝试导入一个本地JSON文件,其中包含书籍数据,如标题、作者、发布年份等。 最初我使用JSON-to-DART转换器来组装一个图书数据模型,现在我正在尝试创建一个函数,在该函数中,程序获取本地JSON文件,并使用类中的方法将数据解析为地图。 我遇到的问题是返回类型

  • 我从github获取了代码,但仍然不起作用 生成FutureBuilder时引发了以下类型错误(脏,状态:_FutureBuilderState#a936c):类型“List”不是类型“Map”的子类型 在此列出声明 这是地图