我的测试Flutter应用程序中的以下代码失败,预期值为'List类型
var columns = data![0]
.keys
.map((keyName) => DataColumn(
label: Expanded(
child: Text(
keyName,
style: const TextStyle(fontStyle: FontStyle.italic),
),
),
))
.toList();
var rows = data!
.map((value) => DataRow(
cells: <DataCell>[
DataCell(Text("${value['name']}")),
DataCell(Text("${value['age']}")),
DataCell(Text("${value['role']}")),
],
))
.toList();
如果我显式地将类型传递给第一个map
.map<DataColumn>((keyName) => DataColumn(
它工作正常。
那么为什么第一个map需要传递类型,而第二个却不需要。这感觉类似于这个SO问题。但是答案是代码工作,但没有解释为什么它只发生在某些情况下。
您需要在变量或映射类型中定义类型
。您有两种选择来做到这一点。
一:定义变量时定义类型如下:
List<DataColumn> columns = data![0]
.keys
.map((keyName) => DataColumn(
label: Expanded(
child: Text(
keyName,
style: const TextStyle(fontStyle: FontStyle.italic),
),
),
))
.toList();
二:定义map中的类型:
var columns = data![0]
.keys
.map<DataColumn>((keyName) => DataColumn(
label: Expanded(
child: Text(
keyName,
style: const TextStyle(fontStyle: FontStyle.italic),
),
),
))
.toList();
因为map
不知道它处理哪种数据,所以它认为它是动态
,当尝试将动态
列表传递给数据列
列表时,它会通过你一个异常。
可能,data![0]. key
的类型与data!
不同。
有时无法推断类型,例如,如果您有一个字符串列表,这些字符串使用带有返回整数的函数的map:
var data = ['a', 'b', 'c'];
var mappedData = data.map((x) => x.length);
在这种情况下,map函数返回的元素类型被推断为动态的。
显式指定map返回的类型是一种很好的做法,以避免潜在的类型错误。