未处理的异常:类型'List<dynamic>'不是'String'类型的子类型无法获取json数据[重复]

Posted

技术标签:

【中文标题】未处理的异常:类型\'List<dynamic>\'不是\'String\'类型的子类型无法获取json数据[重复]【英文标题】:Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'String' Can't fetch json data [duplicate]未处理的异常:类型'List<dynamic>'不是'String'类型的子类型无法获取json数据[重复] 【发布时间】:2021-05-09 11:04:15 【问题描述】:

谁能帮我解决这个问题。我无法使用flutter http请求从json中获取数据,因为它得到了这个未处理的异常:类型'List'不是'String'类型的子类型并且想要在滚动到底部时加载更多数据屏幕。谁能帮帮我...

postData.dart 文件

class PostData extends StatefulWidget 
  const PostData(Key key) : super(key: key);

  @override
  _PostDataState createState() => _PostDataState();


class _PostDataState extends State<PostData> 
  List<String> getData = List();
  ScrollController _scrollController = ScrollController();

  @override
  void initState() 
    super.initState();
    fetchFive();

    _scrollController.addListener(() 
      if (_scrollController.position.pixels ==
          _scrollController.position.maxScrollExtent) 
        fetchFive();
      
    );
  

  @override
  void dispose() 
    _scrollController.dispose();
    super.dispose();
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
        appBar: AppBar(
          title: Text("Load Page"),
          toolbarHeight: 65,
          backgroundColor: Colors.blueAccent[700],
        ),
        body: ListView.builder(
            controller: _scrollController,
            itemCount: getData.length,
            itemBuilder: (context, index) 
              return Card(
                child: GestureDetector(
                  child: ListTile(
                    title: Text(getData[index]),
                  ),
                ),
              );
            ));
  

  fetch() async 
    final response =
        await http.get('https://my-json-server.typicode.com/typicode/demo/posts');

    if (response.statusCode == 200) 
      setState(() 
        getData.add(json.decode(response.body));
      );
     else 
      throw Exception('Failed to load data');
    
  

  fetchFive() 
    for (int i = 0; i < 5; i++) 
      fetch();
    
  

getData.dart 文件模型 json

class Users 
  final int no;
  final String nosiri;
  final String lokasi;
  final String status;
  final String pemilik;
  final String thumbnailurl;

  Users(
      this.no,
      this.nosiri,
      this.lokasi,
      this.status,
      this.pemilik,
      this.thumbnailurl);

  factory Users.fromJson(Map<String, dynamic> json) 
    return Users(
      no: json['no'],
      nosiri: json['no_siri'],
      lokasi: json['lokasi'],
      status: json['status'],
      pemilik: json['pemilik'],
      thumbnailurl: json['thumbnailurl'],
    );
  

【问题讨论】:

【参考方案1】:

作为回复,您收到 List&lt;Map&gt;,并且您正尝试将其存储在 List&lt;String&gt;。请将其更改为 List&lt;dynamic&gt;List&lt;Map&gt;

   [
      
        "id": 1,
        "title": "Post 1"
      ,
      
        "id": 2,
        "title": "Post 2"
      ,
      
        "id": 3,
        "title": "Post 3"
      
    ]
 

【讨论】:

【参考方案2】:

通过检查您的代码,您的回复是List&lt;Map&gt; 表单并且您声明List&lt;String&gt;。所以你需要从List 中删除你的String 格式。

List getData = List();

然后你需要将你的数据转换成List,如下图,然后在getData中一一添加。然后您可以将您的数据添加到Text

ListTile(
  title: Text(getData[index]['title'].toString()),
),

你的 fetch() 方法就像

  fetch() async 
    final response = await http
        .get('https://my-json-server.typicode.com/typicode/demo/posts');

    if (response.statusCode == 200) 
      setState(() 
        final data = json.decode(response.body);
        for (var i in data) 
          getData.add(i);
        
      );
     else 
      throw Exception('Failed to load data');
    
  

【讨论】:

【参考方案3】:

试试

List<Users> getData = [];

改变

getData.add(json.decode(response.body));

getData.addAll(List<Users>.from(json.decode(response.body).map((x) => Users.fromJson(x))));

【讨论】:

但在滚动不起作用时加载数据。数据重复了这么多……你不知道为什么吗? 可能您使用的是 add 而不是 addAll,并且您获取了 5 次?不确定 我正在使用 addAll,是的,我只想获取 5 个数据,但它似乎显示所有数据,当我向下滚动时,它会获取重复的数据...顺便说一句,谢谢 我明白了,在您获取数据后尝试 setState,我强烈建议您在您的情况下使用 flutter_pagewise 所以我需要将 listview 更改为 pagewiselistview 对吗?

以上是关于未处理的异常:类型'List<dynamic>'不是'String'类型的子类型无法获取json数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

未处理的异常:类型 'List<dynamic>' 不是类型 'Map<String, dynamic>' 的子类型

Dart 未处理的异常:类型 'List<dynamic>' 不是类型 'Family' 的子类型,- Flutter

未处理的异常:类型“List<dynamic>”不是“List<CustomerTransactionDetail>”类型的子类型

未处理的异常:类型'List<dynamic>'不是'String'类型的子类型无法获取json数据[重复]

未处理的异常:类型“ImmutableMap<String, dynamic>”不是类型转换中“List<dynamic>”类型的子类型

未处理的异常:类型“List<dynamic>”不是 dart/flutter 中“Map<String, dynamic>”类型的子类型