type 'List<dynamic>' is not a subtype of type 'List<TableRow>' flutter

Issue

I have a json object where data array contains different maps including a map with the type list and data which contains another array of maps.

{
  "data": [
        {
          "type": "title",
          "data": "data1"
        },
        {
          "type": "text",
          "data": "data2"
        },
        {
          "type": "list",
          "data": [
            {
              "item1": "value1"

            },
            {
              "item2": "value2"

            },
            {
              "item3": "value3"

            }

          ]
        }
      ],
}

I also have view where i want to show the different items such as the title, text and list. I am able to show the text and title with the Text() widget.

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:salescore_mobile_app/app_controllers/block_handler/list_block_handler.dart';
import '../app_controllers/getters/settings_getters/get_client_settings.dart';
import 'app_menu.dart';

class AppView extends StatefulWidget {
  final List items;
  const AppView({Key? key, required this.items}) : super(key: key);

  @override
  _AppBaseState createState() => _AppBaseState();
}

class _AppBaseState extends State<AppView> {
  @override
  initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: CustomScrollView(
          slivers: <Widget>[
            const SliverToBoxAdapter(),
            SliverList(
              delegate:
                  SliverChildBuilderDelegate((BuildContext context, int index) {
                return Column(
                  children: [
                    if (widget.items[index]['type'] == "list")
                      Container(
                          alignment: Alignment.topLeft,
                          child: Padding(
                            padding: const EdgeInsets.all(25),
                            child: SingleChildScrollView(
                              child: Table(
                                columnWidths: const {
                                  0: FixedColumnWidth(50),
                                  1: FlexColumnWidth(),
                                },
                                children:
                                    (widget.items[index]['data']).map((object) {
                                  return TableRow(children: [
                                    Container(
                                        color: (widget.items[index]['data'])
                                                        .indexOf(object) %
                                                    2 ==
                                                0
                                            ? const Color(0xFF161616)
                                            : Colors.grey[800],
                                        padding: const EdgeInsets.all(15),
                                        child: Text(
                                          object["title"].toString(),
                                          style: TextStyle(color: Colors.white),
                                        )),
                                  ]);
                                }).toList(),
                                border: TableBorder.all(
                                    width: 1, color: Color(0xFF161616)),
                              ),
                            ),
                          ))
                    else
                      Container(),
                    if (widget.items[index]['type'] == "title")
                      Container(
                        alignment: Alignment.topLeft,
                        child: Text(
                          widget.items[index]['data'],
                        ),
                      )
                    else
                      Container(),
                    if (widget.items[index]['type'] == "text")
                      Container(
                        alignment: Alignment.topLeft,
                        child: Text(
                          widget.items[index]['data'],
                        ),
                      )
                    else
                      Container(),
                  ],
                );
              }, childCount: widget.items.length),
            ),
          ],
        ),
        drawer: const AppMenu(),
      ),
    );
  }
}

As you can see i want to show the item1 inside TableRow, but the map with key item1 inside list array which i want to show inside TableRow gives an error: type 'List<dynamic>' is not a subtype of type 'List<TableRow>'.

This is because widget.items[index]['data'] which is the array maps of key list shows the array keys and values without quotes as the following when i debugPrint it:

[
            {
              item1: value1

            },
            {
              item2: value2

            },
            {
              item3: value3

            }

          ]

My question is how can I resolve the type decleration in my code so I can show item1 value as TableRow

Solution

You will need to cast it. You can do this by calling .cast<TableRow>() on the List<dynamic>

So where you have

}).toList(),

You can change that to

}).toList().cast<TableRow>(),

Or even better, is to indicate the type on the map function.
To do this you can change

(widget.items[index]['data']).map((object) {

to

(widget.items[index]['data']).map<TableRow>((object) {

Answered By – Ivo Beckers

Answer Checked By – Marilyn (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *