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

DSo*_*ldo 5 dart flutter

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

class HomeScreen extends StatelessWidget
Run Code Online (Sandbox Code Playgroud)

使用模型

class HomeScreenModel extends ChangeNotifier
Run Code Online (Sandbox Code Playgroud)

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

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

调用这个 init() 函数的正确位置是什么?据我所知,对于无状态小部件,没有仅调用一次的生命周期函数。不过,我很确定 HomeScreenModel 的构造函数只被调用一次。

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

谢谢大家!

DSo*_*ldo 5

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

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

    notifyListeners();
  });
}
Run Code Online (Sandbox Code Playgroud)

init 函数原型是

Future<void> init(BuildContext context) async
Run Code Online (Sandbox Code Playgroud)

我发现另一种方法是使用 StatefulWidget 并从

initState()
Run Code Online (Sandbox Code Playgroud)

功能。该函数仅被调用一次,因此类似于 ChangeNotifier 构造函数。

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

我希望它可以帮助别人