【问题标题】:How to get data from the FutureProvider in flutter如何在颤振中从 FutureProvider 获取数据
【发布时间】:2019-11-21 05:00:24
【问题描述】:

我正在尝试在使用 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 直接从数据库中获取数据,但我知道它应该来自提供程序,所以我想把它改正

【问题讨论】:

    标签: flutter dart flutter-provider


    【解决方案1】:

    FutureProviderbuilder 返回的Future 的结果暴露给其后代。

    因此,使用以下FutureProvider

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

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

    Provider.of<int>(context)
    

    或:

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

    【讨论】:

    • 你给了一个提示,我使用 FutureProvider.value(value:SharedPreferences.getInstance()) 因为我使用 MultiProvider
    【解决方案2】:

    在我的示例中,我使用 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),
                        );
                      },
                    );
            })));
    

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 2022-10-06
      • 2021-02-16
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2021-10-30
      • 2019-01-01
      相关资源
      最近更新 更多