点击图标时颤动小部件重建

问题描述

一个 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))
            ],));
}

enter image description here

编辑:

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 (将#修改为@)