Flutter FutureBuilder с Isar DB не обновляется

У меня есть простое приложение, в котором перечислено множество элементов, сохраненных в базе данных Isar:

        @override
  Widget build(BuildContext context) {
    var body = Column(
      children: <Widget>[
        const SizedBox(height: 2.0),
        Expanded(
          child: FutureBuilder<List<Item>>(
            future: getAllItems(),
            builder:
                (BuildContext context, AsyncSnapshot<List<Item>> snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return const Center(
                  child: CircularProgressIndicator(),
                );
              } else if (snapshot.hasError) {
                // If there was an error while fetching the data, show an error message
                return Center(
                  child: Text('Error: ${snapshot.error}'),
                );
              } else if (snapshot.hasData) {
                var items = snapshot.data!;
                return ListView.builder(
                  itemCount: items.length,
                  itemBuilder: (context, index) {
                    return ItemRowCard(
                      item: items[index],
                      onRowTap: () async {
                        // tapping the row takes you to edit the item name
                        dynamic result = await Navigator.pushNamed(context, '/edit_item', arguments: {
                          'item_name': item.name,
                          'item_id': item.id
                        });
                        if (result != null) {
                          setState(){}; // should cause the build function to rerun
                        }
                      },
                    );
                  },
                );
              } else {
                return const Center(
                  child: Text('No data found.'),
                );
              }
            },
          ),
        ),
      ],
    );
  }

The getAllItems()использует Isar db для получения данных:

        Future<List<Item>> getAllFolders() async {
    final isar = await db;
    final items = await isar.items.where().findAll();
    return Future.value(items);
  }

Это работает, НО всякий раз, когда я добавляю или редактирую элемент (см.onRowTapвызов), обновление страницы не отобразит изменения, если я не вставлю задержку примерно в 1 секунду перед вызовомsetStateпосле получения результата.

Что мне не хватает? Я вообще в тупике по этому поводу :). Все вызовы Isar асинхронны с ожиданием, поэтому технически они должны возвращаться ПОСЛЕ завершения операции с БД, и я должен иметь возможность вызывать setState без добавления задержек вручную!

0 ответов

Другие вопросы по тегам