【问题标题】:Error listing information with rest API with Flutter使用 Flutter 使用 rest API 列出信息时出错
【发布时间】:2021-10-01 21:13:28
【问题描述】:

我正在尝试列出屏幕上剩余的 API 中的信息。我有这个方法:

late List<MyModel> _listAll; // original list fetched from API
late List<MyModel> _displayList; 
.
.

void _ListTransaction() async {
    
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String token = prefs.getString("userToken") ?? "";

    dynamic data = await http.get(Uri.parse('....'), headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      'Authorization': '$token',
    });
    
    List<MyModel> listAll= [];

    for (var u in data) {
      MyModel myModel = MyModel.fromJson(u);
      print(myModel);
      listAll.add(myModel);
    }

    setState(() {
      _listAll = listAll;
      _displayList = _listAll ;
    });
  }

这里我得到了错误:

_TypeError(类型 '_InternalLinkedHashMap' 不是类型 'Iterable' 的子类型)

我也试过这种方法:

void _ListTransaction() async {

    SharedPreferences prefs = await SharedPreferences.getInstance();
    String token = prefs.getString("userToken") ?? "";

    dynamic data = await http.get(Uri.parse('....'), headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      'Authorization': '$token',
    });

   var list = json.decode(data.body);
    print(list);

    setState(() {
      _listAll = list;
      _displayedList = _petrolList;
    });
    
  }

但在这里我得到了错误:

_TypeError(类型'_InternalLinkedHashMap'不是类型'List'的子类型)

你们可以帮我解决这个错误。我感谢任何 cmets!

更新 我也用过这种方法,但是没用!

这是我的 json.decode(data.body); 的结构

我的模特:

class TransactionModel {
  int? month;
  int? year;
  double? balanceFull;
  double? balanceMonth;
  ExpenseModel? expenseModel;
  RevenueModel? revenueModel; 

  TransactionModel();

  Transactions() {
    month = 00;
    year = 0000;
    balanceFull = 0;
    balanceMonth = 0;
  }

  TransactionModel.fromJson(Map<String, dynamic> json) {
    month = json['month'];
    year = json['year'];
    balanceFull = json['balanceFull'];
    balanceMonth = json['balanceMonth'];
    expenseModel = json['expenseModel'];
    revenueModel = json['revenueModel'];
  }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我认为错误是_listAll是MyModel的类型列表,但是“setState”方法中的list是Map

    希望能帮到你。

    【讨论】:

    • 感谢您的反馈。我做了一个更新。我修改了我的代码,但我仍然有一些错误。谢谢!
    【解决方案2】:

    你应该这样做:

    var result = json.decode(data.body);
    List<Map<String, dynamic>> list = (result as List).map((e) => e as Map<String, dynamic>).toList();
    list.forEach((element) {
      _listAll.add(MyModel.fromJson(element));
    }
    

    就我而言,这是可行的,因为我的 API 中的 result var 中有一个 Map&lt;String, dynamic&gt; 列表。

    编辑: 根据您的评论和屏幕截图,您应该这样做:

    Map<String, dynamic> result = json.decode(data.body) as Map<String, dynamic>;
    result.forEach((element) {
      _listAll.add(MyModel.fromJson(element));
    }
    

    TransactionModel

    TransactionModel.fromJson(Map<String, dynamic> json) {
        month = json['month'];
        year = json['year'];
        balanceFull = json['balanceFull'];
        balanceMonth = json['balanceMonth'];
        List<Map<String, dynamic>> expenseList = (json["expenses"] as List).map((e) => e as Map<String, dynamic>).toList();
        List<Map<String, dynamic>> revenueList = (json["revenues"] as List).map((e) => e as Map<String, dynamic>).toList();
        expenseModel = ExpenseModel.fromJson(list.first) // You can loop
        revenueModel = RevenueModel.fromJson(revenueList.first) // Same
      }
    

    这个想法是,在进行转换之前,您需要将每个嵌套模型转换为 Map&lt;String, dynamic&gt;

    不久前我有同样的issue

    【讨论】:

    • 以这种方式测试,但我得到:--- Map' 不是类型转换中“List”类型的子类型
    • 我已经编辑了答案,因为我知道您的回复不是List
    • 感谢您的反馈,但我仍然遇到问题:无法将参数类型 'void Function(String)' 分配给参数类型 'void Function(String, dynamic)'
    • 我又编辑了。如果这仍然不起作用,我可以请您提供data.body 的输出吗?所以我可以看到结构和json.decode(data.body)。我个人使用的是jsonDecode() 方法而不是json.decode,但我认为这不会改变您的用例。
    • 我放了一张json.body的图片和我正在使用的模板!
    【解决方案3】:

    上周我遇到了类似的问题。

    我使用以下代码解决了它:

      int _offset = 0;
      List<Skeleton> array_news = [];
    
      Future<List<Skeleton>> fetchNews(int offset) async {
        final response = await http.get(Uri.parse(
            'http://192.168.15.5:5000//custom-events?limit=3&offset=$offset'));
    
        return parseNews(response.body);
      }
    
      List<Skeleton> parseNews(String responseBody) {
        final parsed =
            json.decode(responseBody)['events'].cast<Map<String, dynamic>>();
        return parsed.map<Skeleton>((json) => Skeleton.fromJson(json)).toList();
      }
    
      void executeScript(int offset) async {
        List news = await fetchNews(offset);
        setState(() {
          news.forEach((data) {
            array_news.add(Skeleton(
                id: data.id,
                title: data.title,
                page_link: data.page_link,
                image_link: data.image_link));
          });
        });
      }
    

    骨架代码:

    class Skeleton {
      int id = 0;
      String title = '';
      String page_link = '';
      String image_link = '';
    
      Skeleton(
          {required this.id,
          required this.title,
          required this.page_link,
          required this.image_link});
    
      Skeleton.fromJson(Map<String, dynamic> json) {
        id = json['id'];
        title = json['title'];
        page_link = json['page_link'];
        image_link = json['image_link'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        data['id'] = this.id;
        data['title'] = this.title;
        data['page_link'] = this.page_link;
        data['image_link'] = this.image_link;
        return data;
      }
    }
    

    之后只需通过索引访问array_news列表数据。

    例如:

    array_news[0].title;
    

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多