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 без добавления задержек вручную!