dart Flutter -用于ListView的过滤列表

13z8s7eq  于 2023-09-28  发布在  Flutter
关注(0)|答案(3)|浏览(121)

我正试图把我在Udemy课程中学到的东西很好地利用起来,为一个简单的假鞋店构建一个应用程序。我想在应用程序的主页面的主要功能是一个水平的ListView(因此,一个可滚动的小部件)与所谓的“热门优惠”。商店中的所有产品都实现了一个 * 鞋 * 模型类,其中包括参数,如名称,品牌,图像路径,最重要的是,一个布尔值isSpecialSale,指定是否鞋(还有什么?))进行特别销售,因此应将其放在“热门优惠”部分。但是,我不知道如何将鞋子列表shoeListFull过滤为onSpecialSale == True鞋子列表,并将其部署到上述ListView中。
我有一个简单的无状态小部件,我试图在其中创建Hot Offers列表,这里命名为shoesFiltered,但是当我在主页中将shoeList设置为shoeListFull(如上所述,包含所有销售的鞋子的列表)时,它没有返回任何内容。我是不是漏了什么?请注意,我还没有讲到我的课程中介绍有状态小部件的部分,所以我试图在不使用setState之类的东西的情况下工作。

class ShoeTile extends StatelessWidget {
  const ShoeTile({super.key, required this.title, required this.shoeList});

  final String title;
  final List<Shoe> shoeList;

  @override
  Widget build(BuildContext context) {
    

    return Expanded(
      child: ListView.builder(
        itemCount: 5,
        scrollDirection: Axis.horizontal,
        itemBuilder: (context, index) {
          for (Shoe shoe in shoeList) {
            List<Shoe> shoesFiltered = [];
            if (shoe.isSpecialSale) {
              shoesFiltered.add(shoe);
            }
          }
        },
      ),
    );
  }
}
nfzehxib

nfzehxib1#

您似乎错过了itemBuilder中的小部件。
你可以这样做。

class ShoeTile extends StatelessWidget {
  const ShoeTile({super.key, required this.title, required this.shoeList});

  final String title;
  final List<Shoe> shoeList;

  @override
  Widget build(BuildContext context) {

    List<Shoe> shoesFiltered = shoeList.where((e) => e.isSpecial).toList();
    return Expanded(
      child: ListView.builder(
        itemCount: shoesFiltered.length > 5 ? 5 : shoesFiltered.length,
        scrollDirection: Axis.horizontal,
        itemBuilder: (context, index) {
          return _ShoeDetailWidget(shoesFiltered[i]); // defined shoe detail widget
        },
      ),
    );
  }

  // you can define _ShoeDetailWidget based on your desire and add more widget if you want
  Widget _ShoeDetailWidget (Shoe: shoe) {
    return Container(
        child: Text(
           shoe.name
        )
    );
  }
}
bjg7j2ky

bjg7j2ky2#

你当前的代码只是循环和添加项目到过滤列表。要显示某些内容,您需要返回一个widget:

itemBuilder: (context, index) {
          if (shoe.isSpecialSale) {
            return YourCustomWidgetToDisplaySale();
          }
        },
y1aodyip

y1aodyip3#

首先,您需要返回itemBuilder内部的一个小部件以查看结果。如果你正在使用一个已有的List,你不应该在itemBuilder中过滤它们,而应该在ListView本身之前过滤它们。最简单的方法是:

@override
  Widget build(BuildContext context) {
    final filtered = shoeList.where((e) => e.isSpecial).toList();
    return ListView.builder(
        shrinkWrap: true,
        itemCount: filtered.length,
        itemBuilder: (context, i) => ListTile(title: Text(filtered[i].name)));
  }

相关问题