Делегат поиска по флаттеру не работает при переходе назад с маршрута - PullRequest
0 голосов
/ 31 декабря 2018

Я использую Flutter SearchDelegate в своем приложении, и вот код:

class NameSearch extends SearchDelegate<String> {
    @override
    List<Widget> buildActions(BuildContext context) {
    return [
      IconButton(
        icon: Icon(Icons.clear),
        onPressed: () {
          query = "";
        },
      )
    ];
    }

    @override
    Widget buildLeading(BuildContext context) {
    return IconButton(
      icon: AnimatedIcon(
          icon: AnimatedIcons.menu_arrow, progress: transitionAnimation),
      onPressed: () {
        close(context, null);
      },
    );
    }

    @override
    Widget buildResults(BuildContext context) {
     return null;
    }

    @override
    Widget buildSuggestions(BuildContext context) {
    suggestionList = query.isEmpty ? [] : List.generate(nameList.length,
     (i) => nameList[i]).where((p) => p.name.startsWith(query)).toList();

    return ListView.builder(
      itemBuilder: (context, index) => ListTile(
            onTap: () {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => DetailScreen(
                            detail: suggestionList[index],
                          )));
            },
            leading: Icon(Icons.book),
            title: RichText(
              text: TextSpan(
                  text: suggestionList[index].name.substring(0, query.length),
                  style: TextStyle(
                      color: Colors.black, fontWeight: FontWeight.bold),
                  children: [
                    TextSpan(
                        text: suggestionList[index].name.substring(query.length),
                        style: TextStyle(color: Colors.grey))
                  ]),
            ),
          ),
      itemCount: suggestionList.length,
    );
    }
}

Когда я щелкаю по элементу в списке предложений, он выводит меня на новый экран подробностей и работает правильно.Но когда я хочу вернуться к экрану поиска, ввод текста становится таким: search screen

И я больше не могу вставлять текст до перезапуска приложения или перехода на другую страницу и после этогоснова на страницу поиска!

А вот мой код DetailScreen:

class DetailScreen extends StatelessWidget {
    final BookDetail detail;
    DetailScreen({Key key, @required this.detail}) : super(key: key);

    @override
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
        title: Text(detail.name),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Text(detail.description),
      ),
    );
    }
}

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Я столкнулся с той же проблемой, поэтому я просто скопировал search.dart из библиотеки материалов и заменил

bool get maintainState => false;

на

bool get maintainState => true;

в строке 294, для которой он работал.я.

0 голосов
/ 07 марта 2019

В строке 83 -85 поиска флаттера исходный код :

После того, как пользователь выбрал результат поиска, необходимо вызвать [SearchDelegate.close], чтобы удалитьстраницу поиска с вершины стека навигации и уведомить абонента [showSearch] о выбранном результате поиска.

Таким образом, showSearch предназначен только для одноразового использования.И вам придется вызывать его снова при переходе назад с вашего DetailScreen, если вы собираетесь использовать его для другого поискового запроса.

...