Как получить данные от FutureProvider во флаттере
Я пытаюсь реализовать поддержку локальной базы данных в своем приложении, которое управляется с помощью Provider, теперь я хочу, чтобы получение данных соответствовало шаблону управления состоянием, но мне это не удалось.
Я пытался сделать традиционного провайдера для достижения этой цели, но приложение застряло в цикле запросов к базе данных, поэтому после некоторого поиска я нашел FutureProvider, но я не могу найти, как я могу получить снимок из загружаемых данных
class _ReceiptsRouteState extends State<ReceiptsRoute> {
List<Receipt> receipts = [];
@override
Widget build(BuildContext context) {
return FutureProvider(
initialData: List(),
builder: (_){
return DBProvider().receipts().then((result) {
receipts = result;
});
},
child: Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).history),
),
body: Container(
child: ListView.builder(
itemBuilder: (context, position) {
final item = receipts[position];
return ListTile(
title: Text(item.date),
);
},
),
),
),
);
}
}
теперь мое приложение работает так, как я хочу, но не так, как оно должно работать, я использовал FutureBuilder для непосредственного получения данных из базы данных, но я знаю, что оно должно поступать через провайдера, поэтому я хочу сделать это правильно
1 ответ
FutureProvider
подвергает результат Future
вернулся builder
его потомкам.
Таким образом, используя следующее FutureProvider
:
FutureProvider<int>(
initialData: 0,
builder: (_) => Future.value(42),
child: ...
)
текущее значение можно получить через:
Provider.of<int>(context)
или же:
Consumer<int>(
builder: (context, value, __) {
return Text(value.toString());
}
);
В моем примере я использовал параметр create FutureProvider для запроса API, затем я использовал Consumer для получения результатов API.
FutureProvider(
create: (_) => peopleService.getAllSurvivor(),
child: Consumer<List<Survivor>>(builder: (context, survivors, _) {
return survivors == null
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: survivors.length,
itemBuilder: (context, index) {
var survivor = survivors[index];
return ListTile(
title: Text(survivor.name),
subtitle: Text(survivor.gender),
leading: Icon(Icons.perm_identity),
);
},
);
})));