【问题标题】:Using RefreshIndicator to refresh listview from web service使用 RefreshIndicator 从 Web 服务刷新列表视图
【发布时间】:2021-06-21 01:07:30
【问题描述】:

我不了解 Flutter 中 RefreshIndicator 的使用。 我有一个诊所病人的列表视图。患者列表在应用中显示后可能会发生变化,其他应用用户可以添加新患者或删除现有患者。

我需要的是实现一种在需要时刷新患者列表的方法。

这里有一段代码,我在其中显示列表项:

//LISTA DE PACIENTES
            Expanded(
              child: Consumer(
                builder: (context, watch, child) {
                  var value = watch(clinicaIdStateProvider).state;

                  return Container(
                    child: FutureBuilder(
                      future: fetchPacientes(value),
                      builder: (context, snapshot) {

                        if (snapshot.hasData) {
                          var filteredList = snapshot.data;
                          print("a minusculas:"+_controller.text.toLowerCase());
                          filteredList = filteredList.where((element) => (
                              element.nombre_completo.toLowerCase().contains(_controller.text.toLowerCase()) ||
                                  element.NHC.toLowerCase().contains(_controller.text.toLowerCase()) ||
                                  element.apellidos.toLowerCase().contains(_controller.text.toLowerCase())
                          )).toList();

                          print("texto filtrado="+_controller.text.toLowerCase());


                          return ListView.builder(
                            itemCount: filteredList.length,
                            shrinkWrap: true,
                            itemBuilder: (BuildContext context, index) {
                              Paciente paciente = filteredList[index];
                              return new GestureDetector(
                                onTap: () {
                                  print("paciente seleccionada nbre: " +
                                      '${paciente.nombre_completo}');
                                },
                                child: new Card(

                                  elevation: 6,
                                  child: new Container(

                                    child: Column(
                                      children: [
                                        Padding(
                                          padding: const EdgeInsets.all(4.0),
                                          child: Row(
                                            mainAxisAlignment:
                                                MainAxisAlignment.spaceBetween,
                                            children: [
                                              Padding(
                                                padding:
                                                    const EdgeInsets.all(4.0),
                                                child: Text(
                                                  "${paciente.apellidos}" +
                                                      ", " +
                                                      "${paciente.nombre_completo}",
                                                  style:
                                                      TextStyle(fontSize: 18),
                                                ),
                                              ),
                                              Column(
                                                children: [
                                                  Container(
                                                    decoration: BoxDecoration(
                                                        color:
                                                            AppColors.azulCapenergy,
                                                        border: Border.all(
                                                          color: AppColors
                                                              .azulCapenergy,
                                                        ),
                                                        borderRadius:
                                                            BorderRadius.all(
                                                                Radius.circular(
                                                                    12))),
                                                    child: Padding(
                                                      padding:
                                                          const EdgeInsets.all(4.0),
                                                      child: Text(
                                                        "NHC: ${paciente.NHC}",
                                                        style: TextStyle(
                                                            color: AppColors
                                                                .blancoCapenergy,
                                                            fontSize: 16),
                                                      ),
                                                    ),

                                                  ),
                                                  SizedBox(height: 3,),
                                                  FlatButton(
                                                    onPressed: (){
                                                      print("boton agenda pulsado de ${paciente.nombre_completo}");
                                                    },
                                                    child: Container(
                                                      decoration: BoxDecoration(
                                                          color:
                                                          Colors.transparent,
                                                          border: Border.all(
                                                            color: AppColors
                                                                .azulCapenergy,
                                                          ),
                                                          borderRadius:
                                                          BorderRadius.all(
                                                              Radius.circular(
                                                                  15))),
                                                      child: Padding(
                                                        padding:
                                                        const EdgeInsets.all(8.0),
                                                        child: Image.network(
                                                          'https://.../agenda.png',
                                                          height: 25,
                                                        ),
                                                      ),

                                                    ),
                                                  ),
                                                ],
                                              ),
                                            ],
                                          ),
                                        ),

                                      ],
                                    ),
                                  ),
                                ),
                              );
                            },
                          );
                        }

                        return Image.asset(
                          "assets/images/vacio.png",
                          fit: BoxFit.contain,
                        );
                      },
                    ),
                  );
                },
              ),
            ),

在 FutureBuilder 子组件中,我正在调用填充列表视图的方法:

fetchPacientes(value)

在我当前的应用中实现 RefreshIndicator 的最佳方式是什么?

【问题讨论】:

    标签: flutter pull-to-refresh


    【解决方案1】:

    这就是我的做法..

    您必须为您的ListView.Builder 创建一个单独的StatefulWidget

    class XYZ extends StatefulWidget {
      final filteredList;
    
      const XYZ(this.filteredList);
      @override
      _XYZState createState() => _XYZState();
    }
    
    class _XYZState extends State<XYZ> {
      var refreshfilteredList;
    
      @override
      Widget build(BuildContext context) {
        var filteredList = refreshfilteredList ?? widget.filteredList;
    
        return RefreshIndicator(
            onRefresh: () async {
              refreshfilteredList = await fetchPacientes(value);
    
              refreshfilteredList = refreshfilteredList
                  .where((element) => (element.nombre_completo
                          .toLowerCase()
                          .contains(_controller.text.toLowerCase()) ||
                      element.NHC
                          .toLowerCase()
                          .contains(_controller.text.toLowerCase()) ||
                      element.apellidos
                          .toLowerCase()
                          .contains(_controller.text.toLowerCase())))
                  .toList();
              setState(() {});
            },
            child: ListView.builder());
      }
    }
    

    实施

     Expanded(
                  child: Consumer(
                    builder: (context, watch, child) {
                      var value = watch(clinicaIdStateProvider).state;
    
                      return Container(
                        child: FutureBuilder(
                          future: fetchPacientes(value),
                          builder: (context, snapshot) {
    
                            if (snapshot.hasData) {
                              var filteredList = snapshot.data;
                              print("a minusculas:"+_controller.text.toLowerCase());
                              filteredList = filteredList.where((element) => (
                                  element.nombre_completo.toLowerCase().contains(_controller.text.toLowerCase()) ||
                                      element.NHC.toLowerCase().contains(_controller.text.toLowerCase()) ||
                                      element.apellidos.toLowerCase().contains(_controller.text.toLowerCase())
                              )).toList();
    
                              print("texto filtrado="+_controller.text.toLowerCase());
    
    
                              return XYZ(filteredList)
    

    【讨论】:

    • 谢谢,但就我而言,如何在父类中实现这个新的小部件?
    • 我应该考虑到我还需要传递一些值才能使其工作,例如需要变量值来过滤患者诊所和 _controller.text 文本来过滤列表搜索字符串
    • 我创建了一个单独的小部件 XYZ,但是缺少对 value 和 _controller.text 的引用
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2013-01-15
    • 2018-07-20
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多