添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
爱运动的小虾米  ·  Android入门教程 | ...·  1 年前    · 
勤奋的香槟  ·  安装 Resource ...·  1 年前    · 
没有腹肌的香菇  ·  javascript - ...·  2 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

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

Ask Question

I have some data which initially is List<Map<String, String>> but in future in some methods calls I have to assign those Map<String, String> elements an <String, dynamic> values. Here is some dart code that shows my intention :

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'] assignment gives me error like this : Error: A value of type 'MyClass' can't be assigned to a variable of type 'String'.

How should I let know dart that don't convert this maps to <String, String> and let it be <String, dynamic> as in future Objects would be the values too.

I have found 1 workaround but I don't want to use it :

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');

This works well but I don't want to use it like this....are there any other ways... I have tried .cast<>() and another type castings but still of no use.

By default Dart infers the type of you data literal map.

In your first example there is only String as values so it infers the type List<Map<String, String>>. In the last snippet it infers List<Map<String, Object>> because there are Strings and ints in values of maps.

You can force the type of data by 2 ways:

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

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.