提问者:小点点

Dart有时只能从map中推断类型


我的测试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问题。但是答案是代码工作,但没有解释为什么它只发生在某些情况下。


共2个答案

匿名用户

您需要在变量或映射类型中定义类型。您有两种选择来做到这一点。

一:定义变量时定义类型如下:

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返回的类型是一种很好的做法,以避免潜在的类型错误。