我怎样才能转移集团供应商
how can i transfer bloc provider
我想将我的 bloc 提供商转移到其他页面,但我该怎么做?
我有一个登录页面。如果用户可以登录应用程序(使用电子邮件和密码),他将转到主页。程序报错,因为登录页有signInCubit,而主页没有。我怎样才能转移这个 bloc builder?我试过了 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,
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)
);
},
),
));
}
}
BlocProvider
自动处理带有实例化新路由上下文的 bloc 实例,但如果您使用 BlocProvider.value
:
则不会发生这种情况
BlocProvider.value(
value: BlocProvider.of<BlocA>(context),
child: ScreenA(),
);
重要说明:BlocProvider.value
应该只用于为新子树提供现有实例,不要用它创建 Bloc 实例,如果你想要你的 BlocProvider
在整个应用程序的范围内,包装你的应用程序的根目录,MaterialApp
,这样就可以了。
还要确保使用 PlocProvider.value
处理您的 bloc 实例,因为它不会自动执行。
我想将我的 bloc 提供商转移到其他页面,但我该怎么做?
我有一个登录页面。如果用户可以登录应用程序(使用电子邮件和密码),他将转到主页。程序报错,因为登录页有signInCubit,而主页没有。我怎样才能转移这个 bloc builder?我试过了 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,
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)
);
},
),
));
}
}
BlocProvider
自动处理带有实例化新路由上下文的 bloc 实例,但如果您使用 BlocProvider.value
:
BlocProvider.value(
value: BlocProvider.of<BlocA>(context),
child: ScreenA(),
);
重要说明:BlocProvider.value
应该只用于为新子树提供现有实例,不要用它创建 Bloc 实例,如果你想要你的 BlocProvider
在整个应用程序的范围内,包装你的应用程序的根目录,MaterialApp
,这样就可以了。
还要确保使用 PlocProvider.value
处理您的 bloc 实例,因为它不会自动执行。