Dart / Flutter Как программно фильтровать ListBuilder на основе значения в списке - PullRequest
1 голос
/ 03 октября 2019

Я думаю, что есть несколько разных способов сделать это, но во 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 ... не уверен, почему эта проверка не сработает ???

Я пытался в моем будущем Builder:

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, что они не отображаются?

1 Ответ

2 голосов
/ 03 октября 2019

Существует более простой синтаксис для фильтрации списка с использованием where, например:

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

Вы можете использовать другой тип в будущем (или, конечно, динамически), чтобы фильтровать список по разнымтипы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...