You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用无法识别模型文件数据,请求排查错误原因

问题排查:Flutter应用无法识别模型文件数据

问题描述

Flutter应用调用API后无法正确解析模型文件中的数据,运行时出现错误,错误截图如下:
错误截图

模型文件代码

// To parse this JSON data, do
//
//     final hisselist = hisselistFromJson(jsonString);

import 'dart:convert';

Hisselist hisselistFromJson(String str) => Hisselist.fromJson(json.decode(str));

String hisselistToJson(Hisselist data) => json.encode(data.toJson());

class Hisselist {
  Hisselist({
    required this.success,
    required this.result,
  });

  bool success;
  List<dynamic> result;

  factory Hisselist.fromJson(Map<String, dynamic> json) => Hisselist(
    success: json["success"],
    result: List<dynamic>.from(json["result"].map((x) => x)),
  );

  Map<String, dynamic> toJson() => {
    "success": success,
    "result": List<dynamic>.from(result.map((x) => x)),
  };
}

class ResultClass {
  ResultClass({
    required this.rate,
    required this.lastprice,
    required this.lastpricestr,
    required this.hacim,
    required this.hacimstr,
    required this.text,
    required this.code,
  });

  double rate;
  double lastprice;
  String lastpricestr;
  double hacim;
  String hacimstr;
  String text;
  String code;

  factory ResultClass.fromJson(Map<String, dynamic> json) => ResultClass(
    rate: json["rate"].toDouble(),
    lastprice: json["lastprice"].toDouble(),
    lastpricestr: json["lastpricestr"],
    hacim: json["hacim"].toDouble(),
    hacimstr: json["hacimstr"],
    text: json["text"],
    code: json["code"],
  );

  Map<String, dynamic> toJson() => {
    "rate": rate,
    "lastprice": lastprice,
    "lastpricestr": lastpricestr,
    "hacim": hacim,
    "hacimstr": hacimstr,
    "text": text,
    "code": code,
  };
}

API调用页面代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:easy_localization/easy_localization.dart';

import '../models/apis/hisselist.dart';

class Stocks extends StatefulWidget {
  Stocks({Key? key}) : super(key: key);

  @override
  _StocksState createState() => _StocksState();
}

class _StocksState extends State<Stocks> with AutomaticKeepAliveClientMixin {
  ScrollController? controller;
  final scaffoldKey = GlobalKey<ScaffoldState>();
  final url = Uri.parse('https://api.collectapi.com/economy/hisseSenedi');
  var counter;
  var hisseResult;
  
  Future callHisse() async {
    try{
      Map<String, String> requestHeaders = {
        'Content-Type': 'application/json',
        'Authorization': 'apikey xxx'
      };
      final response = await http.get(url,headers:requestHeaders);

      if(response.statusCode == 200){
        var result = hisselistFromJson(response.body);
        if(mounted);
        setState(() {
          counter = 200;
          hisseResult = result;
        });
        return result;
      } else {
        print(response.statusCode);
      }
    } catch(e) {
      print(e.toString());
    }
  }
  
  @override
  void initState() {
    super.initState();
    callHisse();
  }
  
  @override
  Widget build(BuildContext context) {
    super.build(context);

    return Scaffold(
      appBar: AppBar(
        centerTitle: false,
        automaticallyImplyLeading: false,
        title: Text('Hisseler').tr(),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: counter != null ?
          ListView.builder(
              itemCount: counter,
              itemBuilder: (context, index){
                return Card(
                  child: ListTile(
                    title: Text(hisseResult.data[index].code),
                    subtitle: Text(hisseResult.data[index].text),
                  ),
                );
          }) : Center(child: CircularProgressIndicator()),
        ),
      ),
    );
  }

  @override
  bool get wantKeepAlive => true;
}

问题排查与修复方案

1. 模型类字段与调用时的字段不匹配

Hisselist类中存储数据的字段是result,但API调用页面中错误使用了hisseResult.data[index],需改为hisseResult.result[index]。

2. 模型类result列表类型未明确指定

当前Hisselist中的result为List<dynamic>,无法正确解析为ResultClass对象,需修改为List<ResultClass>并调整解析逻辑:

class Hisselist {
  Hisselist({
    required this.success,
    required this.result,
  });

  bool success;
  List<ResultClass> result; // 替换dynamic为ResultClass

  factory Hisselist.fromJson(Map<String, dynamic> json) => Hisselist(
    success: json["success"],
    // 解析时转换为ResultClass实例
    result: List<ResultClass>.from(json["result"].map((x) => ResultClass.fromJson(x))),
  );

  Map<String, dynamic> toJson() => {
    "success": success,
    "result": List<dynamic>.from(result.map((x) => x.toJson())),
  };
}

3. 硬编码列表长度不合理

API返回的result列表长度并非固定200,需用实际列表长度作为ListView.builder的itemCount,避免数组越界:

setState(() {
  counter = result.result.length; // 替换200为实际列表长度
  hisseResult = result;
});

4. 调用时字段名错误修正

在ListView.builder的itemBuilder中,修正字段访问路径:

title: Text(hisseResult.result[index].code),
subtitle: Text(hisseResult.result[index].text),

5. 空安全优化(可选)

直接用hisseResult的存在状态判断加载状态,去掉冗余的counter变量:

child: hisseResult != null ?
  ListView.builder(
      itemCount: hisseResult.result.length,
      itemBuilder: (context, index){
        final item = hisseResult.result[index];
        return Card(
          child: ListTile(
            title: Text(item.code),
            subtitle: Text(item.text),
          ),
        );
  }) : Center(child: CircularProgressIndicator()),

内容的提问来源于stack exchange,提问作者Mıktad Tahir Durak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:54:15