skip to Main Content

i’m trying to fetch data using GetX in flutter. Whenever I try to show the data I always get the following error:

Map<String, dynamic>' is not a subtype of type 'CategoryModel').

This is my GetBuilder:

GetBuilder<CategoriesController>(builder: (categories) {
                    return GridView.count(
                      crossAxisCount: 4,
                      shrinkWrap: true,
                      physics: ScrollPhysics(),
                      mainAxisSpacing: 8,
                      crossAxisSpacing: 8,
                      childAspectRatio: 60 / 100,
                      children: List.generate(categories.categoriesList.length,
                          (index) {
                        return _buildSingleCategory(
                            index, categories.categoriesList[index]!);
                      }),
                    );
                  }),

And this is my _buildSingleCategory widget:

Widget _buildSingleCategory(int position, CategoryModel category) {
    return InkWell(
        onTap: () {
          Navigator.push(
              context,
              new MaterialPageRoute(
                  builder: (context) => new ProductListPage()));
        },
        child: Container(
          child: Column(
            children: [
              Container(
                padding: EdgeInsets.all(16),
                margin: EdgeInsets.only(bottom: 5),
                width: double.infinity,
                height: 80,
                decoration: style.shadowContainer(),
                child: Image.asset('assets/images/kale.png'),
              ),
              Text(
                category.name,
                style: TextStyle(fontSize: 13),
              ),
            ],
          ),
        ));
  }

And this is my model:

class CategoryModel {
  final int id;
  final String name;
  final String photo;

  CategoryModel({required this.id, required this.name, required this.photo});

  factory CategoryModel.fromJson(Map<String, dynamic> json) => CategoryModel(
        id: json["id"],
        name: json["name"],
        photo: json["photo"],
      );
}

List<CategoryModel> categoryModelFromJson(String str) {
  return List<CategoryModel>.from(json.decode(str).map((x) => CategoryModel.fromJson(x)));
}

I’d be glad if someone helps me with this, thanks in advance!

2

Answers


  1. I think categories.categoriesList is a list of Map<String, dynamic>. Make sure it is a List of CategoryModel.

    Login or Signup to reply.
  2. I see that you’re declaring _buildSingleCategory to accept an int and CategoryModel :

    Widget _buildSingleCategory(int position, CategoryModel category) {
    // ...
    

    but here you’re passing the wrong types :

    // ...
    (index) {
      return _buildSingleCategory(
            index, categories.categoriesList[index]!);
     }),
    

    I assume here that the categories.categoriesList[index]! is a Map<String, dynamic>, so what you need it to modelize it to a CategoryModel with the fromJson method like this:

    GetBuilder<CategoriesController>(builder: (categories) {
                        return GridView.count(
                          crossAxisCount: 4,
                          shrinkWrap: true,
                          physics: ScrollPhysics(),
                          mainAxisSpacing: 8,
                          crossAxisSpacing: 8,
                          childAspectRatio: 60 / 100,
                          children: List.generate(categories.categoriesList.length,
                              (index) {
                            return _buildSingleCategory(
                                index, CategoryModel.fromJson(categories.categoriesList[index]!)); // check this
                          }),
                        );
                      }),
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search