【问题标题】:TextField's autofocus property causing the widget into 'dirty' StateTextField 的 autofocus 属性导致小部件进入“脏”状态
【发布时间】:2019-06-20 17:46:51
【问题描述】:

AppBar 有一个搜索图标,当点击它时,它会在 'title' 属性中显示一个 TextField。单击搜索图标时,我需要 TextField 自动对焦。问题在于“autofocus”属性,如果设置为 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);
      },
    );
  }

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    您可以设置TextField的FocusNode属性并在Button上点击调用FocusScope.of(context).requestFocus(_focusNode);

    【讨论】:

      【解决方案2】:

      问题与 InheritedWidgets 有关。原因不止一个 InheritedWidget。我有一个包装 runApp() 函数的父小部件(保存对 api 对象的引用)和一个包装每个路由的子小部件(保存对每个特定屏幕的 bloc 类的引用)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2021-07-16
        • 2018-08-07
        • 2019-11-17
        • 1970-01-01
        相关资源
        最近更新 更多