问题描述
我想将我的 bloc 提供商转移到其他页面,但我该怎么做?
我有一个登录页面。如果用户可以登录应用程序(使用电子邮件和密码),他将转到主页。程序报错,因为登录页面有signInCubit,而homePage没有。我怎样才能转移这个集团建设者?我试过 blocprovider.value 但它不能。
它给出了这个错误:错误:在这个 BlocListener
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 实例,因为它不会自动处理。