问题描述
一个 gif 我比文字更好,但为了描述这个问题,我有一个搜索栏可以在列表中搜索。它返回结果,但是当我单击某些信息的结果(信息图标)时,它会重新开始搜索,因此正在重建页面,当我按“确定”时,它会报告“查找停用的小部件的祖先是不安全的”。 我知道问题来自刷新,但我不知道为什么会调用刷新,我只是按了一个按钮
编辑:这似乎与构建方法和键盘有关..但我不知道我的代码有什么不好..
class HistoriquePage extends StatefulWidget {
final String pageName;
final String namespace;
const HistoriquePage({Key? key,required this.pageName,required this.namespace}) : super(key: key);
@override
_HistoriquePageState createState() => _HistoriquePageState();
}
class _HistoriquePageState extends State<HistoriquePage> {
final _debounce = Debounce();
DateTimeRange? daterange;
String searchedValue = "";
Post? user;
@override
void dispose() {
_debounce.dispose();
super.dispose();
}
void _sendSearch(String value) {
_debounce.run(() {
setState(() {
searchedValue = value;
});
});
}
@override
Widget build(BuildContext context) => GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),child: Scaffold(
appBar: AppBar(
title: Text(widget.pageName),),body: SingleChildScrollView(
child: Column(
children: [
Container(
child: SafeArea(
child: DaterangeField(
enabled: true,// initialValue: DateTimeRange(
// // start: DateTime.parse("2020-01-01"),// end: DateTime.Now()),firstDate: new DateTime(2020),helpText: 'Sélectionnez un interval de dates',fieldStartLabelText: 'Date de début',fieldEndLabelText: 'Date de fin',fieldStartHintText: 'Début',fieldEndHintText: 'Fin',dateFormat: DateFormat('dd/MM/yyyy'),saveText: 'OK',// initialEntryMode: DatePickerEntryMode.input,decoration: Inputdecoration(
// labelText: 'Interval de temps pour la recherche',prefixIcon: Icon(Icons.date_range,color: Theme.of(context).primaryColor),hintText: 'Sélectionnez un intervalle de dates',hintStyle: TextStyle(color: Specific.getWhite),border: OutlineInputBorder(),onChanged: (value) {
setState(() {
daterange = value!;
});
}),Container(
padding: EdgeInsets.all(16),child: TextField(
decoration: Inputdecoration(
prefixIcon: Icon(Icons.search,labelText: 'Sélectionnez le composant',labelStyle: TextStyle(color: Specific.getWhite)),onChanged: _sendSearch),Container(height: MediaQuery.of(context).size.height - 150,child: ComponentsHistoriqueDeployment(searchedValue,daterange: daterange))
],));
}
编辑:
class ComponentsHistoriqueDeployment extends StatelessWidget {
final String searchedValue;
final DateTimeRange? daterange;
ComponentsHistoriqueDeployment(this.searchedValue,{this.daterange});
@override
Widget build(BuildContext context) {
return FutureBuilder<List<User>>(
future: HistoriqueService.fetchHistorique(searchedValue,daterange: daterange),builder: (context,snapshot) {
if (snapshot.hasData && snapshot.connectionState == ConnectionState.done) {
final result = snapshot.data!;
if (result.length > 0) {
return Padding(
padding: const EdgeInsets.only(left: 5,right: 5),child: ListView.separated(
separatorBuilder: (BuildContext context,int index) => const Divider(),itemCount: result.length,itemBuilder: (context,index) {
return Card(
child: Column(children: [
Padding(
padding: const EdgeInsets.only(top: 8),child: Badge(
toAnimate: true,animationDuration: Duration(seconds: 2),shape: BadgeShape.square,badgeColor: Theme.of(context).primaryColor,borderRadius: BorderRadius.circular(8),badgeContent: Text(result[index].name,style: TextStyle(color: Specific.getWhite,fontSize: 16)),_displayMoreinformationOnComponent(result,index,context)
]),);
}),);
} else {
return _noresultFound();
}
} else {
return Center(child: CircularProgressIndicator());
}
});
}
}
Widget _noresultFound() {
return Container(
child: new Center(
child: new Column(
children: const <Widget>[
Icon(
Icons.warning_outlined,color: Colors.orange,size: 50.0,semanticLabel: "Attention : Aucun résultat n'a été trouvé...",Text(
"Aucun résultat n'a été trouvé...",style: TextStyle(fontSize: 20),],);
}
Widget _displayMoreinformationOnComponent(result,context) {
return Container(
child: ListTile(
title: Text('Tag: ' + result[index].username),subtitle: Text('Date: ' + result[index].address.street),leading: Icon(Icons.label),trailing: Wrap(
spacing: 20,children: <Widget>[
IconButton(
icon: Icon(Icons.help),onpressed: () => Dialogs.bottomMaterialDialog(
msgStyle: TextStyle(fontSize: 16),msg: 'Tag: ' +
result[index].name +
'\nStatus: ' +
result[index].name +
'\nDernier déploiement: ' +
result[index].name +
'\nType de route: ' +
result[index].name +
'\nDernier commit par: ' +
result[index].name +
'\n',title: result[index].name,color: Specific.getorange,context: context,actions: [
IconsButton(
text: "OK",iconData: Icons.check_circle,color: Colors.green,textStyle: TextStyle(color: Specific.getWhite),iconColor: Specific.getWhite,onpressed: () {
Navigator.of(context).pop();
},]),);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)