草庐IT

json - 在 flutter 中从 API 获取数据时获取错误类型'_InternalLinkedHashMap<String, dynamic >' is not a subtype of type ' Iterable<dynamic>'

coder 2023-07-24 原文

我是 flutter 的新手,我尝试从 API 获取数据,但出现错误

type'_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>'.

我正在从 API 获取新闻数据。我对简单的 API 进行了尝试,它成功了,当我对复杂的 API 进行了尝试,并在 dart 代码中进行了一些更改时,我遇到了这个错误。

抱歉,如果我没有正确解释。我已经粘贴了用于此 API 的所有代码。

我没有得到任何解决方案。我在这里发布我的代码。

post.dart

 class Post {
     List<Articles> articles;

     Post({this.articles});

     factory Post.fromJson(Map<String, dynamic> json) {
        return Post(
           articles: json['articles'].map((value) => new Articles.fromJson(value)).toList(),
     );
  }
}

article.dart

 class Articles{
     final String title;
     final String description;
     final String url;
     final String urlToImage;
     final String publishedAt;
     final String content;

      Articles({this.title, this.description, this.url, this.urlToImage, this.publishedAt, this.content});

      factory Articles.fromJson(Map<String, dynamic> json) {
          return Articles(
              title: json['title'],
              description: json['description'],
              url: json['url'],
              urlToImage: json['urlToImage'],
              publishedAt: json['publishedAt'],
              content: json['content'],
         );
       }

   }

technology_post.dart

   Future<List<Post>> fetchPost() async {
      final response = await http.get('https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=47ada2986be0434699996aaf4902169b');
      if (response.statusCode == 200) {
          var responseData = json.decode(response.body);
          List<Post> posts = [];
          for(var item in responseData){
             Post news = Post.fromJson(item);
             posts.add(news);
          }
       return posts;
      } else {
           throw Exception('Failed to load post');
      }
  }

  class Technology extends StatelessWidget{
      final Future<List<Post>> post;
      Technology({Key key, this.post}) : super (key : key);

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: FutureBuilder<List<Post>>(
               future: post,
               builder: (context, snapshot) {
                  if (snapshot.hasData) {
                      return ListView.builder(
                         itemBuilder: (BuildContext context, int index){
                         var dataStored = "";
                         for(var i = 0; i < 10; i++){
                             dataStored = snapshot.data.articles[i].title;
                             return ListTile(
                                title: Text(dataStored),
                             );
                         }
                     }
                );
        } else if (snapshot.hasError) {
          return Text("${snapshot.error}");
        }
         return CircularProgressIndicator();
        },
      ),
     ),
   );
  }
}

homescreen.dart

  TabBarView(
              children: [
                Technology(post: fetchPost()),
                Text('General'),
                Text('Cricket')
              ]

我已经发布了我希望的所有必需代码。如果您想查看 API,可以查看 here

抱歉,如果我在这里粘贴了太多代码。

为什么会出现此错误以及如何解决此问题。

提前致谢。

最佳答案

根据您的 json,没有列表,只有 Post,因为 json 是 json 对象。 因此,按如下方式更改您的 fetchPost() 函数:

    Future<Post> fetchPost() async {
    final response = await http.get(
    'https://newsapi.org/v2/top-headlines? 
    sources=techcrunch&apiKey=$YOUR_API_KEY');
    if (response.statusCode == 200) {
    var responseData = jsonDecode(response.body);
    var post = Post.fromJson(responseData);
    return post;
    } else {
    throw Exception('Failed to load post');
    }
    }

注意:从您的问题中删除您的 api key 并仅出于隐私目的粘贴 json。

并将您的技术等级更改为

    class Technology extends StatelessWidget {
                      final Future<Post> post;

                      Technology({Key key, this.post}) : super(key: key);

                      @override
                      Widget build(BuildContext context) {
                        return Scaffold(
                          body: Center(
                            child: FutureBuilder<Post>(
                              future: post,
                              builder: (context, snapshot) {
                                if (snapshot.hasData) {
                                  return ListView.builder(
                                      itemBuilder: (BuildContext context, int index) {
                                    return Text(snapshot.data.articles[0].publishedAt);
                                  });
                                } else if (snapshot.hasError) {
                                  return Text("${snapshot.error}");
                                }
                                return CircularProgressIndicator();
                              },
                            ),
                          ),
                        );
                      }
                    }

您的主要问题还在于您没有将 json['articles'] 转换为列表。你应该将 Post.fromJson 函数更改为

                    factory Post.fromJson(Map<String, dynamic> json) {
              return Post(
                articles: (json['articles'] as List).map((value) => new Articles.fromJson(value)).toList(),
              );
            }

这应该可以解决您的问题。

关于json - 在 flutter 中从 API 获取数据时获取错误类型'_InternalLinkedHashMap<String, dynamic >' is not a subtype of type ' Iterable<dynamic>',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54644749/

有关json - 在 flutter 中从 API 获取数据时获取错误类型'_InternalLinkedHashMap<String, dynamic >' is not a subtype of type ' Iterable<dynamic>'的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  7. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  8. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  9. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  10. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

随机推荐