skip to Main Content

I have a list like this:

List<ProductModel> productList = [
    ProductModel(name: "Oranges", date: "2023-05-01"),    
    ProductModel(name: "Apples", date: "2023-05-01"),
    ProductModel(name: "Kiwis", date: "2023-03-01"),
];

I would like to group the items by date using groupBy and display it in Widget build as so:

2023-05-01:
Oranges
Apples

2023-03-01:
Kiwis

Currently, I am getting the following error: The operator '[]' isn't defined for the type 'Object'. and I can’t seem to fix it.

My code is below.

class ProductListPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _ProductListPageState();
}

class _ProductListPageState extends State<ProductListPage> {
  late StreamController<int> _postsController;

  @override
  void initState() {
    _postsController = new StreamController();
    getProducts();
    super.initState();
  }

  void getProducts() {
    Fetch.getProdcuts().then((value) => {
      _postsController.add(1);
      
      List<ProductModel> productList = [];

      for (var item in value!) {

         final encode = json.encode(item.toJson());
         final product = ProductModel.fromJson(jsonDecode(encode));
         productList.add(product);
      }

      //I get the error here:
      var groupByDate = groupBy(productList, (obj) => obj?.date.substring(0, 10));

    });
  }

  @override
    Widget build(BuildContext context) {
        //Build method here
    }

class ProductModel extends Object {
  String? name;
  String? date;

  ProductModel({this.name, this.date});

  ProductModel.fromJson(Map<String, dynamic> json) {
    name = json["name"];
    date = json["date"];
  }

  Map<String, dynamic> toJson() => {
    'name': name,
    'date': date,
  };
}

This is what I also tried but I am getting various errors:

var groupByDate = groupBy(value!.toList(), value.map((obj) => ProductModel.fromJson(obj)).toList());

-> Error: The argument type 'List<ProductModel>' can't be assigned to the parameter type 'dynamic Function(ProductModel)'.

var groupByDate = groupBy(value!.toList(), (obj) => obj?.date.substring(0, 10).toList());

-> Error: The getter 'date' isn't defined for the type 'Object'.

Now I am basically out of ides. Any help will be appreciated!

2

Answers


  1. void getProducts() {
      Fetch.getProdcuts().then((value) {
        _postsController.add(1);
    
        var productList = value
            .map((obj) => ProductModel.fromJson(obj as Map<String, dynamic>))
            .toList();
    
        var groupByDate = groupBy(
            productList, (obj) => obj.date?.substring(0, 10) ?? '');
    
        
      });
    }
    
    Login or Signup to reply.
  2. I apologize for the oversight in my previous response. It seems that the groupBy() function is not recognizing the objects in the list as instances of ProductModel.

    To fix this issue, you can try using the map() method to create a new list of ProductModel objects from the JSON response, like this:

    void getProducts() {
      Fetch.getProdcuts().then((value) => {
        _postsController.add(1);
    
        List<ProductModel> productList = value.map((json) {
          return ProductModel.fromJson(json);
        }).toList();
    
        var groupByDate = groupBy(productList, (obj) => obj.date!.substring(0, 10));
      });
    }
    

    In the above code, we use the map() method to create a new list of ProductModel objects from the value list. The map() method applies the provided function to each element of the list and returns a new list containing the results.

    We then call the toList() method on the result of the map() method to convert the iterable to a list of ProductModel objects.

    Finally, we can use the groupBy() function to group the products by date.

    I hope this helps to resolve the issue.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search