如何从Flutter中获取FutureProvider的数据

时间:2019-07-11 12:58:46

标签: flutter dart flutter-provider

我正在尝试在由Provider管理的flutter应用程序中实现本地数据库支持,现在我想使数据检索服从状态管理模式,但是我一直失败。

我尝试创建一个传统的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直接从数据库中获取数据,但是我知道它应该通过提供程序传递,所以我想使其正确

2 个答案:

答案 0 :(得分:1)

FutureProviderFuture返回的builder的结果暴露给后代。

因此,请使用以下FutureProvider

FutureProvider<int>(
  initialData: 0,
  builder: (_) => Future.value(42),
  child: ...
)

可以通过以下方式获取当前值:

Provider.of<int>(context)

或:

Consumer<int>(
  builder: (context, value, __) {
    return Text(value.toString());
  }
);

答案 1 :(得分:0)

在我的示例中,我使用FutureProvider的create参数来请求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),
                    );
                  },
                );
        })));