Listview не обновляется динамически с TextField - PullRequest
2 голосов
/ 02 ноября 2019

В настоящее время я пытаюсь обновить ListView, используя TextField, но у меня возникли проблемы. Первоначально ListView корректно обновляется после инициализации, но в тот момент, когда я что-то набираю, он становится пустым.

Это мой код:

class TabbarViewWidget extends StatefulWidget {
  TabbarViewWidget({this.selectedList});

  final List<String> selectedList;

  @override
  _TabbarViewWidgetState createState() => _TabbarViewWidgetState();
}

class _TabbarViewWidgetState extends State<TabbarViewWidget> {
  TextEditingController textController = TextEditingController();

  var items = List<String>();

  void filteredSearch(String query) {
    List<String> dummySearchList = List();
    dummySearchList.addAll(widget.selectedList);
    if (query.isNotEmpty) {
      List<String> dummyListData = List();
      dummySearchList.forEach((item) {
        if (item.contains(query)) {
          dummyListData.add(query);
        }
      });
      setState(() {
        items.clear();
        items.addAll(dummyListData);
      });
      return;
    } else {
      setState(() {
        items.clear();
        items.addAll(widget.selectedList);
      });
    }
  }

  @override
  void initState() {
    items = widget.selectedList;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        Padding(
          padding: EdgeInsets.all(15.0),
          child: TextField(
            onChanged: (value) {
              filteredSearch(value.toUpperCase());
            },
            controller: textController,
            decoration: InputDecoration(
                hintText: "Search",
                labelText: "Search",
                prefixIcon: Icon(Icons.search),
                border: OutlineInputBorder(
                    borderRadius: BorderRadius.all(
                  Radius.circular(25.0),
                ))),
          ),
        ),
        Expanded(
            child: ListView.builder(
                itemCount: items.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text('${items[index]}'),
                  );
                })),
      ],
    );
  }
}

Нужна помощь! Я - самоучка, энтузиаст флаттера, поэтому, возможно, я не знаю много вещей. Пожалуйста, потерпите меня!

1 Ответ

2 голосов
/ 02 ноября 2019

Каким-то образом (я не копал почему) ваш список в widget.selectedList был очищен методом filteredSearch.

Я немного изменил ваш код, и он работает:

List items = List<String>();

  void filteredSearch(String query) {
    items = widget.selectedList.where((txt) => query.isEmpty || txt.contains(query)).toList();
    setState(() {
    });
  }

  @override
  void initState() {
    items = widget.selectedList;
    super.initState();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...