dart Flutter group By date:未为类型“Object”定义运算符“[]”

4zcjmb1e  于 2023-05-11  发布在  Flutter
关注(0)|答案(2)|浏览(163)

我有一个这样的列表:

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

我想使用groupBy按日期对项目进行分组,并在Widget build中显示如下:

2023-05-01:
Oranges
Apples

2023-03-01:
Kiwis

目前,我得到以下错误:The operator '[]' isn't defined for the type 'Object'.我似乎无法修复它。
代码在下面。

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,
  };
}

这是我也尝试过,但我得到了各种错误:
var groupByDate = groupBy(value!.toList(), value.map((obj) => ProductModel.fromJson(obj)).toList());
->错误: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());
->错误:The getter 'date' isn't defined for the type 'Object'.
现在我基本上出主意了。任何帮助将不胜感激!

uubf1zoe

uubf1zoe1#

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) ?? '');

    
  });
}
dzhpxtsq

dzhpxtsq2#

我为我之前回复中的疏忽道歉。似乎groupBy()函数没有将列表中的对象识别为ProductModel的示例。
要解决此问题,您可以尝试使用map()方法从JSON响应创建ProductModel对象的新列表,如下所示:

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));
  });
}

在上面的代码中,我们使用map()方法从value列表中创建一个新的ProductModel对象列表。map()方法将提供的函数应用于列表的每个元素,并返回一个包含结果的新列表。
然后,我们对map()方法的结果调用toList()方法,将可迭代对象转换为ProductModel对象的列表。
最后,我们可以使用groupBy()函数按日期对产品进行分组。
我希望这有助于解决这个问题。

相关问题