首页 > 解决方案 > 在提供者构造函数中初始化 bloc 与初始化 bloc 实例变量的内联声明

问题描述

在创建了扩展 InheritedWidget 的 Bloc Provider 类之后,在 Provider 构造函数中初始化 bloc 实例变量和在声明变量时初始化它有什么区别?

class CommentsProvider extends InheritedWidget {

  final CommentsBloc bloc;

  CommentsProvider({Key key, Widget child})
    : bloc = CommentsBloc(),
      super(key: key, child: child);
}

class CommentsProvider extends InheritedWidget {

  final CommentsBloc bloc = CommentsBloc();

  CommentsProvider({Key key, Widget child})
    : super(key: key, child: child);
}

标签: flutterdartbloc

解决方案


这两个是严格等价的,但两个选项都不好。

您不应该Inheritedwidget中创建变异数据。您很容易失去您的状态,这被认为是不好的做法。

而是考虑将您的Inheritedwidge包装 到StatefulWidget中,或使用诸如provider.

使用provider,您不再需要制作此类课程。相反,您可以直接执行以下操作:

Provider(
  builder: (_) => CommentsBloc(),
  dispose: (_, bloc) => bloc.dispose(),
  child: Whatever(),
) 

推荐阅读