首页 > 解决方案 > Dart / Flutter 如何根据 List 中的值以编程方式过滤 ListBuilder

问题描述

我在想有几种不同的方法可以做到这一点,但在 Flutter 中,我需要从列表中过滤掉值。值为 sts[index].type。我看到此构建器正确显示所有记录:

return ListView.builder(
        itemCount: sts == null ? 0 : sts.length,
        itemBuilder: (BuildContext context, int index) {
            return Card(
              child: Container(
                child: InkWell(
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => DetailsDaily(site: sts[index]),
                        ),
                      );
                    },
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.stretch,
                      children: <Widget>[
                        Text(
                          sts[index].name,
                          style: TextStyle(fontSize: 20.0, color: Colors.black),
                        ),
                      ],
                    )),
                padding: const EdgeInsets.all(15.0),
              ),
            );
          }
        });

我尝试了 if / else 来过滤值:

return ListView.builder(
        itemCount: sts == null ? 0 : sts.length,
        itemBuilder: (BuildContext context, int index) {
          if (sts[index].type == "SNTL") {
             //return the widget with only SNTL types
          }

但是,我遇到了需要显示退货的问题……但是,我只希望 SNTL 显示……不知道为什么该检查不起作用?

我在我的futurebuilder中尝试过:

FutureBuilder(
                future: DefaultAssetBundle.of(context)
                    .loadString('assets/stations-strings.json'),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    List<SnoTelSiteModel> sites =
                        parseJson(snapshot.data.toString());
                    for(var s in sites){
                      if(s.type == "SNTL"){
                        return SnotelList(sts: sites);
                      }
                    }
                  }
                  return CircularProgressIndicator();
                }),

但是,它返回了我所有的结果......

我最后一次尝试是返回一个包含已过滤掉的值的列表,但我不希望这样,因为我想控制将来在屏幕上显示的类型。

我在 if/else 中做错了什么,这些没有显示?

标签: listflutterdart

解决方案


有一种更简单的语法可以使用 过滤列表where,例如:

  List<SnoTelSiteModel> sites;
  return sites.where((site) => site.type == 'SNTL').toList();

您将来可以使用不同的类型(或者,当然,动态地)按不同类型过滤列表。


推荐阅读