如何在带有bloc_library的BlocListener中使用多个状态?

问题描述

例如,我有以下伪代码

if(state1.status==ok&&state2.status==ok) {do something}

MultiBlocListener在这里不适用,因为我只能分别监听状态,我尝试嵌套BlocListener,但它并没有帮助我,因为外部BlocListener不会通知内部状态更改。所以在内部,只有在内部状态改变的那一刻,我才能检查外部的状态。

目前,我通过使用嵌套的BlocBuilderWidgetsBinding.instance.addPostFrameCallback解决了这个问题。在这种情况下,外部BlocBuilder会重建内部class SplashScreen extends StatefulWidget { static const routeName = 'splash'; static const logoUrl = 'assets/images/logo.svg'; const SplashScreen({Key key}) : super(key: key); @override _SplashScreenState createState() => _SplashScreenState(); } class _SplashScreenState extends State<SplashScreen> { @override Widget build(BuildContext context) { void _navigateto(String routeName) => Navigator.of(context).pushReplacementNamed(routeName); return Scaffold( backgroundColor: Theme.of(context).backgroundColor,body: BlocBuilder<SettingsBloc,Settingsstate>( builder: (context,settingsstate) { return BlocBuilder<AuthenticationBloc,AuthenticationState>( builder: (context,authenticationState) { WidgetsBinding.instance.addPostFrameCallback((_) { if (authenticationState.status == AuthenticationStatus.UNAUTHENTICATED) { Timer(Duration(seconds: 1),() => _navigateto(LoginScreen.routeName)); } else if (authenticationState.status == AuthenticationStatus.AUTHENTICATED) { switch (settingsstate.currentType) { case FastAccesstype.UNKNowN: break; case FastAccesstype.NONE: Timer(Duration(seconds: 1),() => _navigateto(HomeScreen.routeName)); break; case FastAccesstype.PIN: Timer(Duration(seconds: 1),() => _navigateto(PinCodeScreen.routeNameLogin)); break; case FastAccesstype.BIOMETRICS: Timer(Duration(seconds: 1),() => _navigateto(BiometricsScreen.routeName)); break; } } }); return Container( decoration: Boxdecoration(gradient: mainGradient),child: Center( child: WebsafeSvg.asset(SplashScreen.logoUrl),),); },); },); } } ,我可以检查多个状态更改是否正确。但我不确定通常是否可以通过这种方式解决此问题。

注意:状态1来自bloc1,状态2来自bloc2,换句话说,来自多个集团的多个状态

这是我现在使用的代码

{{1}}

当我在设备导航测试中看到两次调用该动画时,它看起来并不干净。

解决方法

尝试条件

          BlocBuilder<BlocT,YourState>(
            bloc: bloc,condition: (c,s) => (s is ValidationState ),