【问题标题】:How to initialise a global instance of a bloc如何初始化一个块的全局实例
【发布时间】:2021-11-02 23:06:48
【问题描述】:

所以我想在整个应用程序中使用相同的 bloc 实例,所以我在 main() 函数之外创建了一个实例,然后将其导入到其他文件中。

它可以工作,但是因为我需要它来触发initState 方法中的事件,所以当我尝试在那里使用它时得到一个空值,就像它尚未初始化一样。

看起来是这样的

late TreatmentcardBloc treatmentcardBloc;

Future main() async {
  treatmentcardBloc = TreatmentcardBloc();
...
}

这是错误

以下 _CastError 被抛出构建 BlocBuilder(脏, 依赖项:[_InheritedProviderScope],状态: _BlocBuilderBaseState#713fd): 空值检查操作符

相关的导致错误的小部件是:
BlocBuilder
file:///home/bihire/development/flutter/companion-project/mobile/lib/screens/d ashboard/treatments/treatment_screen.dart:179:35

我在哪里出错了,如果可能的话,为什么?

请记住,当我使用新的初始化强制页面重建时,它会起作用。这有点意味着它的 bloc 实例创建迟了。

【问题讨论】:

  • 请分享构建方法

标签: flutter dart bloc


【解决方案1】:

我通常有一个 Global 类来初始化我称之为 controllerGlobalBloc 实例。然后我在需要的地方将其引用为global.controller

我的 main.dart 看起来像这样:

late Global global;
var rootKey = GlobalKey<_AppState>();

void main() async {
  ...

  // Initialize global manager
  global = Global();
  await global.initialize();

  runZonedGuarded(() => runApp(App(key: rootKey)), global.onUnhandledError);
}

Global 初始化我的全局 BLoC 实例,称为controller

class Global {
  Future<void> initialize() async {  
    ...
    
    // Inizialize global controller
    controller = GlobalBloc();
  } 

  ...      
}

然后我在我的应用页面中将其引用为 global.controller

global.controller.stream.listen((status) async { 
  switch (status) {
    case InitializedState: 
      ... 
      break;
    case ...
  }
});  

请注意,我只将全局控制器用于真正常见的功能(例如应用初始化程序、错误处理等),并且我总是为所有具有业务逻辑的页面和小部件创建专用控制器。

希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    只需在 bloc 文件的末尾创建该 bloc 的实例。像这样:

    // inside Your bloc.dart file
    class Bloc{
    ...
    }
    final bloc = Bloc();
    

    那么您将可以在应用程序内的任何地方访问您的 bloc。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2014-09-14
      • 2013-04-14
      相关资源
      最近更新 更多