我一直在关注这篇文章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,
),
),
)
);
}
}
答案 0 :(得分:0)
通过将我的整个家用脚手架放在一个手势检测器中来解决此问题
onTap: (){
FocusScope.of(context).unfocus();
},