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>类型,类型不匹配导致报错。
具体修改步骤
给方法参数指定明确类型
修改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语句修改见下一步 }明确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();推荐优化:遵循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
相关产品推荐
相关产品推荐

