Home > Mobile >  How do i call all elements of a nested array in dart[Flutter]?
How do i call all elements of a nested array in dart[Flutter]?

Time:08-24

I have a nested array that i'm trying to get all the records in it's interests but i'm getting error doing that, kind of new to this , below is the array list

{
  interests: 
     [
        {
          id: 1, 
          name: Fashion, 
        }, 
        {
          id: 2, 
          name: Art, 
        }
    ]
}

How do i get the list of all ids and names at once from the interest...

i tried

var data = convert.json.decode(response.body);
    print(data["interests"][0]["name"].toString());


if (response.statusCode == 200) {
     streamControllerforInterestList.add(data);
   }

and this only gives the first, when i use 1, the second. but i can't make it empty... please help. thanks and i'm trying to send it into a stream builder below

StreamBuilder<List>(
        stream: streamControllerforInterestList.stream,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasData) {
            return MultiSelectChipField<Interest?>(
              items: [
                for (Map document in snapshot.data)
                  MultiSelectItem<Interest>(
                      (document[["id"]]), document[["name"]])
              ].toList(),
              icon: const Icon(
                Icons.clear,
                color: Colors.black,
              ),
              showHeader: false,
              scroll: false,
              // title: const Text("Interests"),
              // headerColor: Colors.blue.withOpacity(0.5),
              decoration: const BoxDecoration(),
              selectedChipColor: HexColor('#FFB7E1').withOpacity(0.5),
              selectedTextStyle:
                  const TextStyle(color: Color.fromARGB(255, 0, 0, 0)),
              onTap: (values) {
                //_selectedAnimals4 = values;
              },
            );
          }
          return Container(
            padding: const EdgeInsets.only(top: 20),
            child: Row(
              children: const [
                Text(
                  ' Loading Interests...',
                  style: TextStyle(
                    color: Colors.grey,
                    fontSize: 14,
                  ),
                ),
              ],
            ),
          );
        },
      ),

CodePudding user response:

Try this model class.

class ModelClass {
  final int id;
  final String name;
  ModelClass({
    required this.id,
    required this.name,
  });

  factory ModelClass.fromMap(Map<String, dynamic> map) {
    return ModelClass(
      id: map['id']?.toInt() ?? 0,
      name: map['name'] ?? '',
    );
  }

  @override
  String toString() => 'ModelClass(id: $id, name: $name)';
}

And get data

  final items = data["interests"];
   
  // this `result` contains all the item.
  final result = items?.map((e) => ModelClass.fromMap(e)).toList() ?? [];

  for (final r in result) {
    print(r.toString());
  }

CodePudding user response:

To work with a such "raw" data, you should use a data-model class, but, if you dont want to, there is snippet:

var newList = data["interests"].map((element) => element["id"]).toList();
  • Related