【问题标题】:How to use providers to load data before consuming如何在消费前使用提供者加载数据
【发布时间】:2021-02-05 02:42:21
【问题描述】:

在我的应用程序中,我以下列方式使用提供者;

我这样创建日程视图;

await Navigator.of(context, rootNavigator: true).push(
                    MaterialPageRoute(
                      builder: (BuildContext context) =>
                          ScheduleView.create(context, experience),
                    ),
                  );

创建函数;

    static Widget create(BuildContext context, ExperienceDetailed experience) {
final db = Provider.of<Database>(context, listen: false);
// to get initial data i need to call function
// db.getSchedules();
// can i just do it here ?
return ChangeNotifierProvider<ScheduleViewModel>(
  create: (context) => ScheduleViewModel(db, experience),
  child: Consumer<ScheduleViewModel>(
    builder: (context, model, _) => ScheduleView(
      experience: experience,
      model: model,
    ),
  ),
);

} 在加载 ScheduleView 之前,我还想加载 ScheduleView 中显示的初始数据集。

加载函数在名为“getSchedule()”的模型内部

目前我在“ScheduleView”中使用initState来调用这个函数并加载初始数据。

有没有办法在调用构建器之前加载数据。我见过名为 MultiProvider 和 ChangeNotifierProxyProvider 的选项。

可以在这里使用吗?

【问题讨论】:

  • 你的意思是using data inside ScheduleView when rebuilding ScheduleView 吗?我认为您的问题有点令人困惑。
  • 是的,我需要在 ScheduleView 首次加载时显示初始数据集。我只需要它进行第一次构建。后续构建用户可以随意加载。
  • 我仍然不明白 ScheduleView 在构建之前如何包含数据(第一次)?你能更详细地描述你的问题吗? (也许在代码中?)
  • 我传递了 db,一个可以将数据获取到 ScheduleViewModel 构造函数的提供程序。然后我可以调用 ScheduleViewModel 中的方法来获取数据。在这里您可以看到我构造了 ScheduleViewModel 对象并将其传递给 ScheduleView 构造函数。但是我仍然需要调用一个方法来在 ScheduleView 的 initState 中加载必要的数据。我想要做的是将初始数据也作为参数传递给 ScheduleView。我通过 ScheduleViewModel 的方式相同。或者调用 ScheduleViewModel 内部的一个方法,在将数据作为参数传递给 ScheduleView 之前获取数据。

标签: flutter provider consumer flutter-change-notifier


【解决方案1】:

我快速猜测一下: ChangeNotifierProvider.value 适合你吗? 您可以先将 ScheduleViewModel 创建为 Object,然后将其作为值传递给提供程序并在下面使用。

我认为您可能需要一个 futureBuilder,它可以选择在异步数据尚未准备好时显示其他小部件。

return FutureBuilder(
  future: db.getSchedules(), // it should be a async future function
    builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
      if(snapshot.connectionState == ConnectionState.done && snapshot.hasData){
        return ... // when data is done you can get the data by snapshot.data
      }else{
        return CircularProgressIndicator(); // waiting widget
      }
    };

);

您可以在这里查看更多详细信息FutureBuilder

【讨论】:

  • 是的。但是在将初始数据传递给 ScheduleView 之前,如何将初始数据加载到 ScheduleViewModel?
  • 你能描述一下initial data是什么以及它是怎么来的吗?你不能把初始数据传给 ScheduleViewModel 的构造函数吗?像你对 db 做的那样,经验?
  • 我已经更新了我的代码,以便您更好地了解我在做什么。正如我在代码中提到的,我可以调用 db.getSchedules();获取初始数据。这将从服务器获取数据。因为这需要一些时间,所以我必须显示一些等待消息。我想知道的是如何在这里正确地做到这一点
  • 在调用 ScheduleView( experience: experience, model: model, ) 之前,数据应该可用,因此可以作为参数传递,或者数据应该在 ScheduleViewModel 中
  • 我认为您的问题是需要等待来自服务器的数据但与提供者无关?我更新了答案。
猜你喜欢
  • 2021-01-28
  • 2019-11-24
  • 2022-01-03
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多