【问题标题】:Listview builder not taking full List Map data FlutterListview builder 没有获取完整的 List Map 数据 Flutter
【发布时间】:2019-11-23 11:51:05
【问题描述】:

我有一组 List> 数据,其中包含产品的名称、数量和日期。我将数据传递到列表视图构建器中,以呈现为每个产品的卡片列表。

产品列表通过:

[{名称:产品1,金额:24.5,日期:2019-07-14 00:00:00.000},{名称: 产品2,金额:29.5,日期:2019-07-14 00:00:00.000},{名称:产品3, 金额:29.5,日期:2019-07-15 00:00:00.000}]

列表视图工作正常,但是我正在尝试添加一个函数,列表视图按创建日期过滤产品。为此,我通过日期时间选择器传递一个日期(使用 setState,默认值为 DateTime.now()),并将产品日期与日期时间选择器中选择的日期进行比较。

请在下面找到代码:

import 'package:flutter/material.dart';
import 'package:learning_app/product.dart';
import 'package:intl/intl.dart';

class BuildProduct extends StatelessWidget {
  final List<Map<String, dynamic>> products;
  final Function updateProduct;
  final DateTime selectedDate;

  Tasks(this.products, this.updateProduct, this.selectedDate);

  Widget _buildCard() {
    DateTime _currentDate = DateTime.now();

    Widget ProductCard = Center(
      child: Text('No Products added'),
    );
    if (products.length > 0) {
      ProductCard = ListView.builder(
        scrollDirection: Axis.vertical,
        shrinkWrap: true,
        itemCount: products.length,
        itemBuilder: (BuildContext context, int index) {
          print("Product List: " + products.toString());
          print("Product Name: " + products[index]['name'].toString());
          print("Product Date: " + products[index]['date'].toString());
          print("Selected Date: " + selectedDate.toString());
          if(DateFormat.yMMMd().format(products[index]['date']) ==
                DateFormat.yMMMd().format(selectedDate)) {
            return ProductCard(products[index], index, updateProduct);
          }
        }
      );
    }
    return ProductCard;
  }

  @override
  Widget build(BuildContext context) {
    return _buildCard();
  }
}

代码的问题是,如果我为新产品(即第三个产品)选择不同的日期,listview 构建器不会将它带入循环,更糟糕的是,当我将新日期作为循环中的产品减1。请在下面找到打印语句以供参考(代码中的那个)

当页面以默认日期打开时:

I/flutter (11152): Product List: [{name: Product 1, amount: 24.5, date: 2019-07-14 00:00:00.000}, {name: Product 2, amount: 29.5, date: 2019-07-14 00:00:00.000}, {name: Product 3, amount: 29.5, date: 2019-07-15 00:00:00.000}]
I/flutter (11152): Product Name: Product 1
I/flutter (11152): Product Date: 2019-07-14 20:13:05.838550
I/flutter (11152): Selected Date: 2019-07-14 20:15:32.687104
I/flutter (11152): Product List: //same list as above
I/flutter (11152): Product Name: Product 2
I/flutter (11152): Product Date: 2019-07-14 20:13:32.398186
I/flutter (11152): Selected Date: 2019-07-14 20:15:32.687104
I/flutter (11152): Product List: //same list as above
I/flutter (11152): Product Name: Product 3
I/flutter (11152): Product Date: 2019-07-15 00:00:00.000
I/flutter (11152): Selected Date: 2019-07-14 20:15:32.687104

当我选择另一个日期(即 2019-07-15)时:

I/flutter (11152): Product List: [{name: Product 1, amount: 24.5, date: 2019-07-14 00:00:00.000}, {name: Product 2, amount: 29.5, date: 2019-07-14 00:00:00.000}, {name: Product 3, amount: 29.5, date: 2019-07-15 00:00:00.000}]
I/flutter (11152): Product Name: Product 1
I/flutter (11152): Product Date: 2019-07-14 20:13:05.838550
I/flutter (11152): Selected Date: 2019-07-15 12:00:00.000Z
I/flutter (11152): Product List: //same list as above
I/flutter (11152): Product Name: Product 2
I/flutter (11152): Product Date: 2019-07-14 20:13:32.398186
I/flutter (11152): Selected Date: 2019-07-15 12:00:00.000Z7104

我只想在选择日期时呈现与所选日期相同的产品(卡片)。请帮助我找到实现中的错误或提出更好的方法来实现目标。任何帮助表示赞赏,谢谢:)

【问题讨论】:

  • 为什么不直接比较DateTime 对象呢?你为什么要把它格式化成字符串?

标签: flutter dart


【解决方案1】:

好的,我认为这将帮助您,而不是将其转换为字符串,然后使用 DateTime 类中可用的 difference() 方法进行比较。您也可以使用inDays 属性来获取天数的差异

代码:

if(products[index]['date'].difference(selectedDate).inDays == 0) {
  return ProductCard(products[index], index, updateProduct);
}

【讨论】:

  • 我使用日期时间格式仅获取日期,因为 difference() 方法比较日期和时间而不是仅日期。
  • 感谢更好的代码推荐,但是我遇到的问题仍然存在(listview builder不接受所有产品进入循环)
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 2021-08-14
  • 2019-05-07
  • 1970-01-01
  • 2020-06-18
  • 2021-01-17
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多