如何告诉飞镖不要将地图转换为 <String, String> 类型并使其成为 <String, Object> 类型?

How to tell dart to not convert map to <String, String> type and let it be <String, Object> type?

我有一些最初是 List<Map<String, String>> 的数据,但将来在某些方法调用中我必须为这些 Map<String, String> 元素分配 <String, dynamic> 值。这是一些显示我意图的飞镖代码:

class MyClass {
  String ageGroup = 'some';
  MyClass({required this.ageGroup});
}

void main() {
  var data = [
    {
      'name': 'john',
      'userName': 'john',
    },
    {
      'name': 'john1',
      'userName': 'john1',
    },
  ];

  // JsLinkedHashMap<String, String> in dartpad
  print(data[0].runtimeType);
  
  // after some while
  // throws an error
  data[0]['ageGroup'] = MyClass(ageGroup: 'something');
}

data[0]['ageGroup'] 作业给我这样的错误:Error: A value of type 'MyClass' can't be assigned to a variable of type 'String'.

我应该如何让 dart 知道不将此映射转换为 <String, String> 并将其设为 <String, dynamic>,因为将来 Objects 也将是值。

我找到了 1 个解决方法,但我不想使用它:

void main() {
  var data = [
    {
      'something_random': 123,
      'name': 'john',
      'userName': 'john',
    },
    {
      'something_random': 123,
      'name': 'john1',
      'userName': 'john1',
    },
  ];
  
  print(data[0].runtimeType);
  
  data[0]['ageGroup'] = MyClass(ageGroup: 'something');
}

这个很好用,但我不想这样用....还有其他方法吗... 我试过 .cast<>() 和另一种类型的转换,但仍然没有用。

默认情况下,Dart 会推断出您 data 文字映射的类型。

在您的第一个示例中,只有字符串作为值,因此它推断类型 List<Map<String, String>>。在最后一个片段中,它推断 List<Map<String, Object>> 因为映射值中有字符串和整数。

您可以通过两种方式强制数据类型:

var data = <Map<String, dynamic>>[...]; // force type of list literal

// or

List<Map<String, dynamic>> data = [...]; // directly type data