某个集团的单个实例如何可以在另一个集团中使用

问题描述

如何避免创建某个bloc类的另一个实例? 我有两个集团:AuthBlocvoid main() { runApp(MyApp()); } class MyApp extends StatelessWidget { final UserRepository repository=UserRepository(); @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider( create: (context) => LoginBloc( //******Extra Instance of AuthBloc in being created here because LoginBloc needs it to listen******** authBloc: AuthBloc(SInitialState(),userRepository: repository),userRepository:repository ),),BlocProvider( create: (context) => AuthBloc(SInitialState(),) ],child: MaterialApp(...); 。和LoginBloc接受AuthBLoc的实例,这是问题所在:

{{1}}

谢谢。

解决方法

您可以在AuthBloc方法内将build()分配给变量。

或者,将一个BlockProvider嵌套在另一个{1>}中:

  BlocProvider<AuthBloc>(
    create: (context) => AuthBloc(SInitialState(),userRepository: repository),child: BlocBuilder<AuthBloc,AuthState>(
      builder: (BuildContext context,AuthState authState) { 
        return BlocProvider(
          create: (context) => LoginBloc(
              authBloc: context.bloc<AuthBloc>(),userRepository: repository,),child: MaterialApp(...),)
        })
      ),

但是最好的解决方案是Bloc to Bloc communication

,

如果我正确提示您问题,则可以使用GetIt 这是示例代码

MultiBlocProvider(
      providers: [
        BlocProvider<SginInBloc>(
          create: (BuildContext context) => sl<SginInBloc>(),child: SginInPage(),....

这样您就可以访问将要创建的Bloc的实例

 final sl = GetIt.instance;
  sl.registerFactory(() => SginInBloc();

这里我使用的是 registerFactory ,但是您可以使用 registerSingleton 取决于您要达到的目标