文本字段焦点节点保持焦点

时间:2020-10-10 19:03:22

标签: android flutter

我一直在关注这篇文章https://medium.com/saugo360/https-medium-com-saugo360-flutter-using-overlay-to-display-floating-widgets-2e6d0e8decb9,在我的搜索栏下方添加了一个自动填充框,看来一切正常,除了覆盖框始终保持打开状态,即使我关闭了文本字段所在的汉堡包菜单。即使进入另一页,叠加层也将保持打开状态。这使得可以认为focusnode无法正常工作。有人知道如何解决这个问题吗?

class TagSearchBox extends StatefulWidget {
  SearchGlobals searchGlobals;
  TextEditingController searchTagsController;
  TagSearchBox(this.searchGlobals, this.searchTagsController);
  @override
  _TagSearchBoxState createState() => _TagSearchBoxState();
}

class _TagSearchBoxState extends State<TagSearchBox> {
  final FocusNode _focusNode = FocusNode();
  OverlayEntry _overlayEntry;
  @override
  void initState() {
    _focusNode.addListener(() {
      if (_focusNode.hasFocus) {
        this._overlayEntry = this._createOverlayEntry();
        Overlay.of(context).insert(this._overlayEntry);
      } else {
        this._overlayEntry.remove();
      }
    });

  }
  OverlayEntry _createOverlayEntry() {
    RenderBox renderBox = context.findRenderObject();
    GelbooruHandler booru = widget.searchGlobals.booruHandler;
    var size = renderBox.size;
    var offset = renderBox.localToGlobal(Offset.zero);

    return OverlayEntry(
        builder: (context) => Positioned(
          left: offset.dx,
          top: offset.dy + size.height + 5.0,
          width: size.width,
          child: Material(
            elevation: 4.0,
            child: FutureBuilder(
                  future: booru.tagSearch(widget.searchTagsController.text),
                    builder: (BuildContext context, AsyncSnapshot snapshot) {
                      if (snapshot.connectionState == ConnectionState.done && snapshot.hasData){
                        return ListView.builder(
                            padding: EdgeInsets.zero,
                            shrinkWrap: true,
                          itemCount: snapshot.data.length,
                            itemBuilder: (BuildContext context, int index) {
                            return ListTile(
                                title: Text(snapshot.data[index]),
                                onTap: (() {
                                  widget.searchTagsController.text = snapshot.data[index];
                                })[![enter image description here][1]][1]
                            );
                          }
                        );
                      } else {
                        return Center(child: CircularProgressIndicator());
                      }
                    }
                ),
            ),
        ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: TextField(
          controller: widget.searchTagsController,
          focusNode: this._focusNode,
          decoration: InputDecoration(
            hintText:"Enter Tags",
            contentPadding: new EdgeInsets.fromLTRB(15,0,0,0), // left,right,top,bottom
            border: new OutlineInputBorder(
              borderRadius: new BorderRadius.circular(50),
              gapPadding: 0,
            ),
          ),
      )
    );
  }
}

Overlay on texfield

Overlay after burger menu closed Overlay on new page

1 个答案:

答案 0 :(得分:0)

通过将我的整个家用脚手架放在一个手势检测器中来解决此问题

onTap: (){
          FocusScope.of(context).unfocus();
        },