将数据异步加载到Flutter中的ChangeNotifier模型中

时间:2019-08-29 13:14:41

标签: flutter dart

在Flutter应用程序中,我有一个小部件

class HomeScreen extends StatelessWidget

使用模型

class HomeScreenModel extends ChangeNotifier

这两个对象使用ChangeNotifierProvider捆绑在一起。

当应用程序加载HomeScreen小部件时,我想调用HomeScreenModel的自定义init()函数,以将磁盘中的某些数据异步加载到模型中,然后使用notifyListeners()函数通知侦听器。这应该做一次。

在什么地方可以调用此init()函数? 据我所知,对于无状态窗口小部件,没有生命周期函数仅调用一次。不过,我很确定HomeScreenModel的构造函数仅被调用一次。

从自己的构造函数中调用async HomeScreenModel.init()函数是否安全? 是否有关于如何将数据异步加载到以ChangeNotifier形式实现的模型中的最佳实践?

谢谢大家!

1 个答案:

答案 0 :(得分:1)

经过一些搜索和测试后,我选择从HomeScreenModel构造函数调用异步init函数。所以我有

HomeScreenModel(BuildContext context) {
  var initFuture = init(context);
  initFuture.then((voidValue) {
    _log.d('init finished');
    state = HomeScreenModelState.initialized;

    notifyListeners();
  });
}

并且init函数原型是

Future<void> init(BuildContext context) async

我发现执行此操作的另一种方法是使用StatefulWidget并从

调用异步init。
initState()

功能。该函数仅被调用一次,就像ChangeNotifier构造函数一样。

到目前为止,我还没有使用StatefulWidgets,因为在我看来,它们在ui和业务逻辑之间建立了一种强大的耦合。所以到目前为止,上述解决方案对我来说似乎还不错。

我希望它可以帮助某人