Как получить данные от 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),
                    );
                  },
                );
        })));
Другие вопросы по тегам