1

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

我像这样创建时间表视图;

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 的选项。

它们可以在这里使用吗?

4

1 回答 1

0

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

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

于 2020-10-23T16:16:49.660 回答