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

Flutter报错:'List<dynamic>'不是'List<DataRow>'的子类型 求助

问题解决:type 'List' is not a subtype of type 'List'

报错根源

_createRows方法中,data.map(...)默认返回Iterable<dynamic>,直接调用toList()得到的是List<dynamic>,而DataTable的rows参数要求严格的List<DataRow>类型,类型不匹配导致报错。

具体修改步骤

  1. 给方法参数指定明确类型
    修改buildBody和_createRows的方法定义,避免Dart推断为dynamic类型:

    Widget buildBody(List<DataRecord> data) {
        return DataTable(columns: _createColumns(), rows: _createRows(data));
    }
    
    List<DataRow> _createRows(List<DataRecord> data) {
        for (DataRecord rec in data){
            print(rec.id.toString() + ' ' + rec.district);
        }
        // 后续return语句修改见下一步
    }
    
  2. 明确map的泛型类型
    在map方法后添加<DataRow>,让Dart明确知道转换后的类型,确保返回List<DataRow>:

    return data.map<DataRow>((e) =>
        DataRow(cells: [
            DataCell(Text(e.id.toString())),
            DataCell(Text(e.district)),
            DataCell(Text(e.consideration.toString())),
        ])).toList();
    
  3. 推荐优化:遵循Dart命名规范
    类名首字母大写(Dart强制规范),避免潜在的命名冲突:

    • 将dataRecord改为DataRecord
    • 将transactions改为Transactions
    • 将_transactionsState改为_TransactionsState
      修改后相关类的定义示例:
    class DataRecord {
        int id = 0;
        String district = '';
        double consideration = 0;
    
        DataRecord(this.id, this.district, this.consideration);
    }
    
    class Transactions extends StatefulWidget {
        @override
        _TransactionsState createState() => _TransactionsState();
    }
    
    class _TransactionsState extends State<Transactions> {
        Future<List<DataRecord>> _func = FetchData();
        // 其余逻辑保持一致,替换所有旧类名引用
    }
    

原理说明

通过指定参数类型和map的泛型参数,让Dart编译器能准确识别数据类型,消除dynamic类型带来的类型不匹配问题,同时规范的命名让代码更易维护。

内容的提问来源于stack exchange,提问作者Tony Lam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:21:12