我如何转移集团供应商

Posted

技术标签:

【中文标题】我如何转移集团供应商【英文标题】:how can i transfer bloc provider 【发布时间】:2021-07-09 12:46:41 【问题描述】:

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

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

它给出了这个错误:错误:在这个 BlocListener Widget 上方找不到正确的 Provider

我的登录页面:

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,
                listener: (context, state) 
                  Navigator.of(context).push(MaterialPageRoute(
                    builder: (_) => SignInPage(),
                  ));
                ),
            BlocListener<SignInCubit, SignInState>(
                listenWhen: (p, c) =>
                    p.errorMessage != c.errorMessage && c.errorMessage != "",
                listener: (context, state) 
                  print(state.errorMessage);
                ),
          ],
          child: BlocBuilder<SignInCubit, SignInState>(
            builder: (context, SignInState state) 
              return Center(
                child: state.isInProgress
                    ? CircularProgressIndicator()
                    : homePageBody(state, context)
              );
            ,
          ),
        ));
  

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

它不能工作兄弟我试过这个,我试过 blocProvider.value。 我不知道 1 blocProvider 可以使用很多页面,例如我在登录页面中使用 blocProvider,也可以使用主页(相同的 blocProvider) 当我将 SignInProvider 放在主页上时它可以工作,但是 signInPage 已经有这个提供者...

以上是关于我如何转移集团供应商的主要内容,如果未能解决你的问题,请参考以下文章

数商云纸业集团供应商管理系统:推进企业信息化建设,全面提升供应商管理效率

华为正式成为沃达丰集团OpenStack云平台供应商

载誉同行,菊风在360集团第二届供应商大会荣获“金牌合作伙伴”

智能|跟着美的集团学习VMI正确的打开方式

SRM供应商协同管理系统功能介绍

蚂蚁集团SOFAStackTugraph等产品入选信通院软件供应链安全名录