【问题标题】:Load data asynchronously into ChangeNotifier model in Flutter在 Flutter 中将数据异步加载到 ChangeNotifier 模型中
【发布时间】:2020-01-02 18:46:03
【问题描述】:

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

class HomeScreen extends StatelessWidget

使用模型

class HomeScreenModel extends ChangeNotifier

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

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

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

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

谢谢大家!

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    经过一番搜索和测试,我选择从 HomeScreenModel 构造函数中调用异步初始化函数。所以我有

    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 并从

    initState()
    

    功能。这个函数只被调用一次,就像 ChangeNotifier 构造函数一样。

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

    希望对大家有帮助

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 2021-08-17
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      相关资源
      最近更新 更多