从Flutter中获取API的数据时,获取错误类型'_InternalLinkedHashMap <string,dynamic =“”>'不是'Iterable <dynamic>'类型的子类型

时间:2019-02-12 07:22:22

标签: json api dart flutter

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

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

我正在从API中获取新闻数据。我为简单的API尝试了此方法,并且奏效了,当我对带有dart代码的某些更改的复杂的API进行尝试时,出现此错误。

对不起,如果我没有正确解释。我已经粘贴了此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

对不起,如果我在这里粘贴了很多代码。

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

谢谢。

2 个答案:

答案 0 :(得分:1)

根据您的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密钥,并仅出于隐私目的粘贴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(),
              );
            }

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

答案 1 :(得分:0)

您应该检查正确的响应类型Int with String。我看到您的API状态:“确定” ,并确保您检查正确。