在Flutter应用程序中,我有一个小部件
class HomeScreen extends StatelessWidget
使用模型
class HomeScreenModel extends ChangeNotifier
这两个对象使用ChangeNotifierProvider捆绑在一起。
当应用程序加载HomeScreen小部件时,我想调用HomeScreenModel的自定义init()函数,以将磁盘中的某些数据异步加载到模型中,然后使用notifyListeners()函数通知侦听器。这应该做一次。
在什么地方可以调用此init()函数? 据我所知,对于无状态窗口小部件,没有生命周期函数仅调用一次。不过,我很确定HomeScreenModel的构造函数仅被调用一次。
从自己的构造函数中调用async HomeScreenModel.init()函数是否安全? 是否有关于如何将数据异步加载到以ChangeNotifier形式实现的模型中的最佳实践?
谢谢大家!
答案 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和业务逻辑之间建立了一种强大的耦合。所以到目前为止,上述解决方案对我来说似乎还不错。
我希望它可以帮助某人