如何在使用之前使用提供程序加载数据

问题描述

在我的应用程序中,我通过以下方式使用provider;

我这样创建时间表视图;

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,child: Consumer<Scheduleviewmodel>(
    builder: (context,model,_) => ScheduleView(
      experience: experience,model: model,);

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

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

此刻,我在“ ScheduleView”中使用initState调用函数并加载初始数据。

有没有一种方法可以在调用构建器之前加载数据。我已经看到了名为MultiProvider和ChangeNotifierProxyProvider的选项。

可以在这里使用它们吗?

解决方法

我快速猜测: ChangeNotifierProvider.value对您有用吗? 您可以先将ScheduleViewModel创建为对象,然后将其作为值传递给provider并在下面使用它。

我认为您可能需要一个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

查看更多详细信息