Flutter - MultiBlocProvider 处于父类和子类监听器未监听状态

问题描述 投票:0回答:1

我的父类和多提供者类

    return MultiBlocProvider(
  providers: [
    BlocProvider<WorkFlowCubit>(
        create: (_) => wf_sl.workflowSl<WorkFlowCubit>()),
    BlocProvider<LoginBloc>(
      create: (BuildContext context) => LoginBloc(ApiRepository()),
    ),
  ],
  child: BaseMyApp(currentThemeMode: (value) {
    currentTheme = value;
  }, child:
      BlocBuilder<AppCubit, AppCubitState>(builder: (context, snapshot) {
    //Base AppCubit for Theme
    return MaterialApp(
      title: AppStrings.kAppName,
      darkTheme: BaseTheme.buildDarkTheme(context),
      home: SplashScreen(),
      navigatorKey: AppNavigationRouter.instance.navigatorKey,
    );
  })),
);

第二堂课,我的听众没有更新状态

return Scaffold(
  body: BlocListener<LoginBloc, LoginState>(
    bloc: LoginBloc(ApiRepository()),
    listener: (context, state) {
     //not getting state here
    print("state*** $state");
   },
    child: Container(
        child: QpSkeletonLoginPage(
          btnTextStyle: AppTextStyles.btnStyle(
              context: context, color: ColorConstants.colorWhite),
          onLogin: () {
            BlocProvider.of<LoginBloc>(context).add(GetLoginUpdate("903XXX248","am@ravathi94"));
           // BaseRoutes.navigateToDashboard();
            _loginBloc.add(GetLoginUpdate("903XXX248","am@ravathi94"));
          },
          btnColor: ColorConstants.colorGreen,
        )),
  ),
);

获取状态更新的区块

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  ApiRepository _apiRepository = ApiRepository();
 
  LoginBloc(this._apiRepository) : super(UserLoadingState()) {
    on<GetLoginUpdate>((event, emit) async {
      emit(UserLoadingState());
      try {
        final keys = await _apiRepository.getAeskeyEncrypt(event.email, event.password);
        emit(UserAesKeyLoadedState(keys));
        final users = await _apiRepository.loginRepo(event.email, event.password);
        emit(UserLoginLoadedState(users));
      } catch (e) {
        emit(UserErrorState(e.toString()));
      }
    });
  }
}

活动课

abstract class LoginEvent extends Equatable {
  const LoginEvent();

  @override
  List<Object> get props => [];
}


class GetLoginUpdate extends LoginEvent {
 final String email;
 final String password;

 GetLoginUpdate(this.email,this.password);

  @override
  List<Object> get props => [email,password];

  @override
  String toString() => 'USER { email: $email }';
}

国家级

@immutable
abstract class LoginState extends Equatable {}

//data loading state
class UserLoadingState extends LoginState {
  @override
  List<Object?> get props => [];
}

class UserLoginLoadedState extends LoginState {
  final LoginModel users;

  UserLoginLoadedState(this.users);

  @override
  List<Object?> get props => [users];
}

class UserAesKeyLoadedState extends LoginState {
  final AesEncryptModel users;

  UserAesKeyLoadedState(this.users);

  @override
  List<Object?> get props => [users];
}

class UserErrorState extends LoginState {
  final String error;

  UserErrorState(this.error);

  @override
  List<Object?> get props => [error];
}
flutter state listener bloc
1个回答
0
投票

您的侦听器没有被触发,因为它正在侦听完全不同的

LoginBloc
实例。

在您的

MultiBlocProvider
中,您创建一个实例:

BlocProvider<LoginBloc>(
  create: (BuildContext context) => LoginBloc(ApiRepository()),
),

但是,在第二堂课中,您创建了一个不同的

LoginBloc
实例。

return Scaffold(
  body: BlocListener<LoginBloc, LoginState>(
    // Creates a new LoginBloc instance. Remove this line.
    // bloc: LoginBloc(ApiRepository()),
    listener: (context, state) {
      //not getting state here
      print("state*** $state");
    },
    child: Container(
      child: QpSkeletonLoginPage(
        btnTextStyle: AppTextStyles.btnStyle(
            context: context, color: ColorConstants.colorWhite),
        onLogin: () {
          /// Just access your [LoginBloc] through the context.
          final loginBloc = BlocProvider.of<LoginBloc>(context);
          loginBloc
              .add(GetLoginUpdate("903XXX248", "am@ravathi94"));
          // BaseRoutes.navigateToDashboard();
        },
        btnColor: ColorConstants.colorGreen,
      ),
    ),
  ),
);

如果您现在尝试,侦听器将触发。

请阅读 Bloc 文件。它们非常清楚:您不需要通过

bloc
参数指定特定的 Bloc 实例 除非 显式管理相同类型的多个 Bloc。

© www.soinside.com 2019 - 2024. All rights reserved.