TextField的autofocus属性导致小部件进入“脏”状态

时间:2019-01-27 15:42:57

标签: dart flutter

AppBar有一个搜索图标,单击时会在'title'属性中显示一个TextField。单击搜索图标时,我需要TextField自动对焦。问题是“自动对焦”属性(如果设置为true),而不是仅更改title属性的状态,而是某种原因导致小部件变成“脏”状态。这将导致调用主构建函数,从而重新构建整个对象。

试图复制它并提供一个示例应用程序,但奇怪的是,它似乎在演示中正常运行。

有任何调试建议吗?

     AppBar(
                  centerTitle: true,
                  title: StreamBuilder(
                      stream: false,
                      initialData: symbolBloc.isSearching,
                      builder: (BuildContext context, AsyncSnapshot<bool> snapshot){
                        if(snapshot.data) {
                          return TextField(
    //                        autofocus: true, <--- here
                            controller: searchQuery,
                            style: new TextStyle(
                              color: Colors.white,
                            ),
                          );
                        }

                        return new Text("", style: new TextStyle(color: Colors.white)
                        );
                      }),
                  backgroundColor: Colors.blueGrey,
                  elevation: 0.0,
                  actions: <Widget>[
                    StreamBuilder(
                      stream: bloc.isSearchActive,
                      initialData: false,
                      builder: (BuildContext context, AsyncSnapshot<bool> snapshot){
                        if(snapshot.data)
                            return activeSearchIconButton(symbolBloc);
                        return searchIconButton(symbolBloc);
                      },

                    ),
                  ],
                ),

 searchIconButton(SymbolBloc bloc){
    return new IconButton(
      icon: new Icon(
        Icons.search,
        color: Colors.white,
      ),
      tooltip: 'Search',
      onPressed: (){
        bloc.displaySearchField(true);
      },
    );
  }

  activeSearchIconButton(SymbolBloc bloc){
    return new IconButton(
      icon: new Icon(
        Icons.close,
        color: Colors.white,
      ),
      tooltip: 'Search',
      onPressed: (){
        bloc.displaySearchField(false);
      },
    );
  }

2 个答案:

答案 0 :(得分:0)

您可以设置FocusNode的{​​{1}}属性,然后在TextField上单击通话Button

答案 1 :(得分:0)

问题与InheritedWidgets有关。原因是有多个InheritedWidget。我有一个父窗口小部件,包裹了runApp()函数(持有对api对象的引用),以及一个孩子小部件,包裹了每条路线(持有对每个特定屏幕的bloc类的引用)。

一旦我将子小部件的内容移到父级并完全删除了子级InheritedWidget,问题就消失了。