如何解决我是 Flutter 的新手并进行自定义 dropdown_search 但卡在 UI 刷新上
我正在尝试在 Flutter 桌面窗口中开发自定义下拉搜索。我在第一次更改密钥时从服务器获取数据并刷新 ui,但在下一次更改密钥时未刷新 ui,但在退格时 ui 刷新。我正在使用 FutureBuilder 和列表视图构建器。在 onChanged 文本字段中,我在文本字段附近显示一个叠加层并调用 api。它运行良好,但在第二次或第三次键更改后,ui 没有刷新,但数据来自 api。我尝试了所有我知道的方法。 任何帮助请。这是我的代码。
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'Widgets/globals.dart';
class Fortest2 extends StatefulWidget {
@override
_Fortest2State createState() =>
_Fortest2State();
}
class _Fortest2State extends State<Fortest2> {
OverlayEntry _overlayEntry;
final nameController =
TextEditingController();
final vendorController =
TextEditingController();
final FocusNode _searchFocus = FocusNode();
final FocusNode _overlayFocus = FocusNode();
final FocusNode _nextFocus = FocusNode();
var isOverlayopen;
List goods;
var goodsId;
var goodsName;
var filter = '';
Future _futureGoods;
Future goodsList() async {
var url = "$webApi/goods/read_filter.php?
query=$filter";
var response = await
http.get(Uri.parse(url));
print(Uri.parse(url));
var goodsList =
json.decode(response.body);
if (response.statusCode == 200) {
print(goodsList);
}
return goodsList;
}
@override
void initState() {
isOverlayopen = 1;
super.initState();
}
@override
void dispose() {
nameController.dispose();
vendorController.dispose();
super.dispose();
}
_fieldFocusChange(
BuildContext context,FocusNode
currentFocus,FocusNode nextFocus) {
currentFocus.unfocus();
FocusScope.of(context).requestFocus(nextFocus);
}
Widget filteredList() {
return Dialog(
elevation: 4.0,child: FutureBuilder(
future: goodsList(),builder: (context,snapshot) {
if (snapshot.hasError)
print(snapshot.error);
return snapshot.hasData
? Column(
children: [
Expanded(
child: ListView.builder(
shrinkWrap: true,physics: ScrollPhysics(),itemCount:
snapshot.data.length,itemBuilder: (context,index) {
List list =
snapshot.data;
return ListTile(
title: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,children: [
Expanded(
child:
InkWell(
onTap: ()
{
setState(() {
goodsId = list[index]['id'];
goodsName = list[index]['name'];
nameController.text =
list[index]['name'];
});
this._overlayEntry.remove();
_searchFocus.unfocus();
print(goodsId);
print(goodsName);
},child:
FocusScope(
node:
FocusScopeNode(),child:
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceEvenly,children: [
Flexible(
child: Text(
list[index]['id'],overflow:
TextOverflow.ellipsis,maxLines: 1,softWrap: true,style: TextStyle(
fontSize: 18.0),),Flexible(
child: Text(
list[index]['name'],overflow:
TextOverflow.ellipsis,style: TextStyle(
fontSize: 18.0),],)),// SizedBox(
// width: 5,// )
],)
],);
},SizedBox(
height: 5,)
],)
: Center(
child:
CircularProgressIndicator(),);
},));
}
OverlayEntry _createOverlayEntry() {
RenderBox renderBox =
context.findRenderObject();
var size = renderBox.size;
var offset =
renderBox.localToGlobal(Offset.zero);
return OverlayEntry(
builder: (context) => Positioned(
left: // 58,offset.dx,top: //150,offset.dy + 95,width: size.width,bottom: 100,child: filteredList()));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(58.0),child: Column(
children: [
TextFormField(
textInputAction: TextInputAction.next,focusNode: _searchFocus,onFieldSubmitted: (term) {
// _fieldFocusChange(context,_searchFocus,_overlayFocus);
//_searchFocus.requestFocus(_overlayFocus);
setState(() {
isOverlayopen = 1;
_overlayEntry.remove();
});
},controller: nameController,onChanged: (value) {
setState(() {
filter = value;
text = value;
_futureGoods = goodsList();
});
if (isOverlayopen == 1) {
this._overlayEntry =
this._createOverlayEntry();
Overlay.of(context).insert(this._overlayEntry);
setState(() {
isOverlayopen = 0;
});
} else {}
//_createOverlayEntry();
},//focusNode: this._focusNode,decoration: InputDecoration(labelText:
'Goods'),TextFormField(
decoration: InputDecoration(labelText:
'Customer'),TextFormField(
//focusNode: _getFocus,controller: vendorController,onChanged: (value) {
setState(() {
text = value;
});
// SearchCustomer();
},decoration: InputDecoration(labelText:
'Vendor'),ElevatedButton(
onPressed: () {
Navigator.of(context).pop();
},child: Text('Back')),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。