首页 > 解决方案 > Flutter RefreshIndicator 指示但不刷新

问题描述

我一直在网上阅读,但我找不到我的代码有什么问题。

有人能抽出几分钟时间帮我一把吗?

这是代码,基本上我有一个带有刷新指示器的futurebuilder,它使用相同的功能,但它不起作用。

Refresh 函数将 api 转储到 SQFlite。

class _MyTasksListViewState extends State<MyTasksListView> {

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<OT>>(
      future: buildList(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return RefreshIndicator(
              child: ListView(
                children: snapshot.data!
                    .map((ot) => ListTile(
                          title: Text("Numero de OT: " + ot.ot.toString()),
                          subtitle: Text("OT Original: " + ot.otOriginal),
                          onTap: () {
                            Navigator.of(context)
                                .pushNamed('/Tareas', arguments: {
                              'Tareas': ot.tareas,
                            });
                          },
                        ))
                    .toList(),
              ),
              onRefresh: () => buildList());
        } else {
          return const Center(child: CircularProgressIndicator());
        }
      },
    );
  }

  Future<List<OT>> buildList() async {
    refresh(context);
    List<OT> lista = [];
    Database database = await initDB();
    var otFromDB = await database.rawQuery("SELECT * FROM 'ots'");
    var tareasFromDB = await database.rawQuery("SELECT * FROM 'tareas'");
    for (var i in otFromDB) {
      OT ot = OT.fromArray(i);
      for (var tarea in tareasFromDB) {
        if (tarea['otID'] == ot.ot) {
          ot.tareas.add(Tarea.fromArray(tarea));
        }
      }
      lista.add(ot);
    }
    return lista;
  }
}

提前致谢!

标签: flutterdart

解决方案


这两个调用都返回了不同的引用

    return FutureBuilder<List<OT>>(
      future: buildList(), // <--

onRefresh: () => buildList() // <-- 

所以我们必须统一引用以获得预期的行为
1- 定义本地 Future 变量

class _MyTasksListViewState extends State<MyTasksListView> {
   late Future<List<OT>> list; // <---

2-初始化变量buildList()

@override
void initState() { 
  super.initState();
  list = buildList(); // <--
}

3-把我们的未来list交给FutureBuilder

    return FutureBuilder<List<OT>>(
      future: list, // <--

4-onRefresh将改变我们list变量的状态

onRefresh: () =>  setState(()=> list = buildList())

就是这样,希望我的回答可以帮助到你


推荐阅读