【问题标题】:Dart,Flutter: Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>' in type castDart,Flutter:异常:类型“List<dynamic>”不是类型转换中“Map<String, dynamic>”类型的子类型
【发布时间】:2020-06-28 07:45:29
【问题描述】:

我想弄清楚如何处理JSON。问题是错误:

"Exception: type 'List&lt;dynamic&gt;' is not a subtype of type 'Map&lt;String, dynamic&gt;' in typecast ".

在 API 示例中,有一个数组,但无论我如何尝试调用它,都没有结果。请求帮忙。另外,请不要因为语法而扔拖鞋。我的英语写作或说得不好。

import 'package:flutter/material.dart';
import 'package:flutterapp/CCData.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class CCList extends StatefulWidget{

  @override
  State<StatefulWidget> createState() {
    return CCListState();
  }
}


class CCListState extends State<CCList>{
  List<CCData> data = [];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('ЛОТОС-РЕСТОРАН'),
        ),
        body: Container(
            child: ListView(
              children: _buildList(),
            )
        ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.refresh),
        onPressed: () => _loadCC(),
      ),
    );
  }

  _loadCC() async{
    final response = await http.get('https://api.coincap.io/v2/assets?limit=4');
    if(response.statusCode == 200){
      //print(response.body);
      var allData = (json.decode(response.body) as Map)['data'] as Map<String, dynamic>;

      var ccDataList = List<CCData>();
      allData.forEach((String key, dynamic val){
        var record = CCData(name: val['name'],
            symbol: val['symbol'], rank: val['rank'], price: val['priceUSD']);
        ccDataList.add(record);
      });
      print(ccDataList);
    }

  }

  List<Widget> _buildList(){
    return data.map((CCData f) => ListTile(
      title: Text(f.symbol),
      subtitle: Text(f.name),
      leading: CircleAvatar(
          child: Text(f.rank.toString())),
      trailing: Text('\$${f.price.toString()}'),
    )).toList();
  }
}

【问题讨论】:

  • 你会在这里添加你的CCData Model 类吗
  • 你也可以添加一个示例 json 吗?
  • print(response.body) 的输出是什么?我猜这行 var allData = (json.decode(response.body) as Map)['data'] as Map;应改为 var allData = (json.decode(response.body) as Map)['data'] as List;

标签: flutter dart


【解决方案1】:

希望能帮到你:

      var responseData= json.decode(response.body);
      var allData = responseData['data'] as List<dynamic>;
      List<CCData> ccDataList = [];
      allData.forEach((val){
        var record = CCData(name: val['name'],
            symbol: val['symbol'], rank: val['rank'], price: val['priceUSD']);
        ccDataList.add(record);
      });

【讨论】:

    【解决方案2】:

    你的问题出在这一行

    var allData = (json.decode(response.body) as Map)['data'] as Map<String, dynamic>;
    

    显然,(json.decode(response.body) as Map)['data'] 返回一个 dynamic 的 List,它不能通过强制转换转换为 Map(不是通过这种方式)。

    要解决这个问题,你应该删除as Map&lt;String, dynamic&gt;

    那么如果你需要将其转换为Map,你应该写

    var myMap = (json.decode(response.body) as Map)['data'].asMap();
    print(myMap); //{0: map1,1: map2, 2: map3}
    

    See official docs here

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2023-01-07
      • 2020-12-21
      • 1970-01-01
      • 2019-08-18
      • 2021-12-02
      • 2021-12-29
      • 2023-01-08
      • 2021-10-25
      相关资源
      最近更新 更多