Flutter中Dart第一个map需显式指定类型,第二个为何无需?
核心差异源于Dart类型推断机制在不同上下文下的表现,结合你的data变量类型(大概率是dynamic,而非明确的List<Map<String, dynamic>>),具体原因如下:
columns的map场景
由于data是dynamic类型,data![0].keys的类型是dynamic的Iterable(而非明确的Iterable<String>)。调用map时,因为源Iterable的类型不明确,Dart无法自动推断出回调的返回类型(DataColumn),只能默认将map的返回类型设为Iterable<dynamic>,toList()后得到List<dynamic>。而DataTable的columns参数要求List<DataColumn>,类型不匹配就会触发报错。
当你显式指定.map<DataColumn>时,相当于强制告知Dart该map操作返回Iterable<DataColumn>,toList()后自然得到符合要求的List<DataColumn>。rows的map场景
尽管data!是dynamic的List,但map回调明确返回了DataRow类型的对象。Dart的类型推断可以直接从回调的返回值推断出map的泛型参数为DataRow,因此map返回Iterable<DataRow>,toList()后得到List<DataRow>,恰好匹配DataTable的rows参数类型,无需显式指定泛型。
额外补充:如果给data变量加上明确的类型注解,比如:
List<Map<String, dynamic>>? data;
第一个map也能自动完成类型推断,无需显式指定泛型参数。
内容的提问来源于stack exchange,提问作者Zach

