从路线导航返回时,颤振搜索委托不起作用

Posted

技术标签:

【中文标题】从路线导航返回时,颤振搜索委托不起作用【英文标题】:Flutter search delegate doesn't work when navigate back from a route 【发布时间】:2019-05-28 04:55:14 【问题描述】:

我在我的应用中使用 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,
    );
    

当我单击建议列表中的某个项目时,它会将我带到新的详细信息屏幕并正常工作。但是当我想回到搜索屏幕时,文本输入变成这样:

我不能再插入任何文本,直到重新启动应用程序或转到另一个页面,然后再次返回搜索页面!

这是我的 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),
      ),
    );
    

【问题讨论】:

有人有解决方案吗?? 【参考方案1】:

在flutter搜索source code的第83-85行:

一旦用户选择了一个搜索结果,[SearchDelegate.close] 应该是 调用以从导航堆栈顶部删除搜索页面,并且 通知 [showSearch] 的调用者所选的搜索结果。

因此,showSearch 仅用于一次性使用。如果您打算将其用于另一个搜索查询,则必须在从 DetailScreen 导航返回时再次调用它。

【讨论】:

【参考方案2】:

我遇到了同样的问题,所以我只是简单地从材料库中复制 search.dart 并替换

bool get maintainState => false;

bool get maintainState => true;

在第 294 行它对我有用。

【讨论】:

我不知道为什么这篇文章有太多的反对票。我知道更改库代码不是一个好主意,但这实际上可以解决问题并完成我的工作。

以上是关于从路线导航返回时,颤振搜索委托不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用模态呈现的 NavigationController(iOS 5 - Storyboard)时,委托不起作用

导航不起作用

颤振热重载和热重启不起作用

滑动以返回在 ios 中的颤振 webview 中不起作用

Bootstrap 4导航栏切换不起作用

Swift UI 委托方法不起作用