Did several google searches, nothing helpful came up. Been banging my head against some errors when trying to do something that should be pretty simple. Convert a map such as {2019-07-26 15:08:42.889861: 150, 2019-07-27 10:26:28.909330: 182} into a list of objects with the format:

class Weight {
  final DateTime date;
  final double weight;
  bool selected = false;

  Weight(this.date, this.weight);
}

I've tried things like: List<Weight> weightData = weights.map((key, value) => Weight(key, value));

There's no toList() method for maps, apparently. So far I'm not loving maps in dart. Nomenclature is confusing between the object type map and the map function. Makes troubleshooting on the internet excruciating.


Solution 1: Pushan Gupta

List<Weight> weightData = List();

weights.forEach((k,v) => weightData.add(Weight(k,v)));


Solution 2: ybakos

Following on Richard Heap's comment above, I would:

List<Weight> weightData =
  mapData.entries.map( (entry) => Weight(entry.key, entry.value)).toList();

Don't forget to call toList, as Dart's map returns a kind of Iterable.


Solution 3: Waqas

Sometimes the typecast will fail and you can enforce it by doing:

List<Weight> weightData =
  weightData.entries.map<Weight>( (entry) => Weight(entry.key, entry.value)).toList();

Example from my project where it wasn't working without typecast:

List<NetworkOption> networkOptions = response.data['data']['networks']
          .map<NetworkOption>((x) => NetworkOption.fromJson(x))
          .toList();


Solution 4: atreeon

Use the entries property on the map object

This returns a List of type MapEntry<key,value>.

myMap.entries.map((entry) => "${entry.key} + ${entry.value}").toList();


Solution 5: Feisal Aswad

Vidor answer is correct .any way this worked for me

      List<String> list = new List();
  userDetails.forEach((k, v) => list.add(userDetails[k].toString()));


Solution 6: shivanand naduvin

You can do this:

List<Weight> weightData = (weights as List ?? []).map((key, value) => Weight(key,value)).toList()

or you can try:

List<Weight> weightData = List.from(weights.map((key, value) => Weight(key, value)))


Solution 7: Sambhav jain

its very simple just initialize a list of your custom object like this

List<CustomObject> list=[];
    for (int i = 0; i < map.length; i++) {
      CustomObject customObject= CustomObject(
       date:map[i]['key'],
       weight:map[i]['key']
      );
      list.add(CustomObject);
    }

hope it works for you thanks


Solution 8: Rithvik Nishad

You can also use a for collection to achieve the same.

var list = [for (var e in map.entries) FooClass(e.key, e.value)];


Solution 9: Vasily Bodnarchuk

Details

  • Flutter 1.26.0-18.0.pre.106

Solution

/libs/extensions/map.dart

extension ListFromMap<Key, Element> on Map<Key, Element> {
  List<T> toList<T>(
          T Function(MapEntry<Key, Element> entry) getElement) =>
      entries.map(getElement).toList();
}

Usage

import 'package:myApp/libs/extensions/map.dart';

final map = {'a': 1, 'b': 2};
print(map.toList((e) => e.value));
print(map.toList((e) => e.key));


Solution 10: Christian Findlay

You simply don't need to. the values property is an Iterable<> of your objects. You can iterate over this or you can convert it to a list. For example,

// ignore_for_file: avoid_print

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets("convert Map to List of Objects", (tester) async {
    final weight1 = Weight(const ValueKey("1"), DateTime.now(), 1);
    final weight2 = Weight(const ValueKey("2"), DateTime.now(), 2);

    final map = {weight1.key: weight1, weight2.key: weight2};

    //You don't have to convert this to a list
    //But you can if you want to
    final list = map.values.toList();

    list.forEach((w) => print("Key: ${w.key} Weight: ${w.weight} "));
  });
}

class Weight {
  final Key key;
  final DateTime date;
  final double weight;
  bool selected = false;

  Weight(this.key, this.date, this.weight);
}


Solution 11: Maksim Gridin

If you need to convert Map values to a list, the simplest oneline code looks like this:

final list = map.values.toList(); 


Solution 12: Azhar Ali

Object Class

class ExampleObject {
  String variable1;
  String variable2;

  ExampleObject({
    required this.variable1,
    required this.variable2,
  });

  Map<String, dynamic> toMap() {
    return {
      'variable1': this.variable1,
      'variable2': this.variable2,
    };
  }

  factory ExampleObject.fromMap(Map<String, dynamic> map) {
    return ExampleObject(
      variable1: map['variable1'] as String,
      variable2: map['variable2'] as String,
    );
  }
}

Convert Map to Object List

List<ExampleObject> objectList = List<ExampleObject>.from(mapDataList.map((x) => ExampleObject.fromMap(x)));