我如何转移集团供应商

问题描述

我想将我的 bloc 提供商转移到其他页面,但我该怎么做?

我有一个登录页面。如果用户可以登录应用程序(使用电子邮件和密码),他将转到主页。程序报错,因为登录页面有signInCubit,而homePage没有。我怎样才能转移这个集团建设者?我试过 blocprovider.value 但它不能。

它给出了这个错误错误在这个 BlocListener Widget 上面找不到正确的提供者

我的登录页面

class SignInPage extends StatelessWidget {
  static const String id = 'sign_in_page';
  SignInPage({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return BlocProvider<SignInCubit>(
      create: (context) => SignInCubit(),child: BlocListener<AuthCubit,AuthState>(
        listenWhen: (AuthState prevIoUs,AuthState current) =>
            prevIoUs.isUserSignedIn != current.isUserSignedIn &&
            current.isUserSignedIn,listener: (context,state) {
         Navigator.of(context).push(MaterialPageRoute(
            builder: (_) => BlocProvider.value(value: BlocProvider.of<SignInCubit>(context),child: HomePage(),),));
        },child: Scaffold(body: signInPageWidget(context)),);
  }
}

我的主页:

class HomePage extends StatelessWidget {
  static const String id = 'home_page';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: MultiBlocListener(
          listeners: [
            BlocListener<AuthCubit,AuthState>(
                listenWhen: (p,c) =>
                    p.isUserSignedIn != c.isUserSignedIn && !c.isUserSignedIn,state) {
                  Navigator.of(context).push(MaterialPageRoute(
                    builder: (_) => SignInPage(),));
                }),BlocListener<SignInCubit,SignInState>(
                listenWhen: (p,c) =>
                    p.errorMessage != c.errorMessage && c.errorMessage != "",state) {
                  print(state.errorMessage);
                }),],child: BlocBuilder<SignInCubit,SignInState>(
            builder: (context,SignInState state) {
              return Center(
                child: state.isInProgress
                    ? CircularProgressIndicator()
                    : homePageBody(state,context)
              );
            },));
  }
}

解决方法

BlocProvider 使用实例化新路由的上下文自动处理 bloc 实例,但如果您使用 BlocProvider.value,则不会发生这种情况:

BlocProvider.value(
  value: BlocProvider.of<BlocA>(context),child: ScreenA(),);

重要说明:BlocProvider.value 应该仅用于向新子树提供现有实例,不要使用它创建 Bloc 实例,如果您希望 BlocProvider 成为在整个应用程序的范围内,包装应用程序的根目录 MaterialApp,这样就可以了。 还要确保使用 PlocProvider.value 处理您的 bloc 实例,因为它不会自动处理。