2

我有一个问题,即流订阅肘部不听肘部的发射状态。这是我如何在代码中实现它们的示例。

这是我想听的肘

class ButtonPressCubit extends Cubit<ButtonState> {

  ButtonPressCubit() : super(ButtonNotPressed());

  void emitButtonOnePressed() => emit(ButtonOnePressed());
  void emitButtonTwoPressed() => emit(ButtonTwoPressed());

}
part of 'internet_cubit.dart';

@immutable
abstract class ButtonState {}

class ButtonNotPressed extends ButtonState {}

class ButtonOnePressed extends ButtonState {}

class ButtonTwoPressed extends ButtonState {}

这是我要订阅的腕尺,我要听的腕尺。

class CounterCubit extends Cubit<CounterState> {
  final ButtonPressCubit buttonPressCubit;
  StreamSubscription buttonPressStreamSubscription;
  CounterCubit({@required this.internetCubit})
      : super(CounterState(counterValue: 0, wasIncremented: false)) {
    buttonPressStreamSubscription = buttonPressCubit.listen(print);
  }

  void increment() => emit(
      CounterState(counterValue: state.counterValue + 1, wasIncremented: true));

  void decrement() => emit(CounterState(
      counterValue: state.counterValue - 1, wasIncremented: false));

  @override
  Future<void> close() {
    buttonPressStreamSubscription.cancel();
    return super.close();
  }
}

之后,我emitButtonOnePressed()像下面这样调用了 ButtonPressCubit。

MaterialButton(
  child: Text('Buton 2'),
  onPressed: () {
    BlocProvider.of<ButtonPressCubit>(context)
      .emitButtonTwoPressed();
    },
),

但这不起作用。如何修复它以获得肘部的状态。

4

1 回答 1

0

如果您在启动之前没有注册该小部件的 Cubit,您应该这样做

这就像告诉颤动这个 Cubit 是这个页面的,并且有一些方法可以做到这一点

第一:如果你有多个集团或

 MultiBlocProvider(
      providers: [
        //other Blocs or Cubits
        BlocProvider<XCubit>(
          create: (BuildContext context) => XCubit(),
          child: XWidget(),
        ),
        //other Blocs or Cubits
      ],
      child: MaterialApp(),....);

第二:如文档

class _AppState extends State<App> {
  final UserRepository _userRepository = UserRepository();
  AuthenticationBloc _authenticationBloc;

  @override
  void initState() {
    super.initState();
    _authenticationBloc = AuthenticationBloc(userRepository: _userRepository);
    _authenticationBloc.dispatch(AppStarted());
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      bloc: _authenticationBloc,
      child: MaterialApp(
        home: BlocBuilder(
          bloc: _authenticationBloc,
          builder: (BuildContext context, AuthenticationState state) {
            //here is your widget you want to run
            return Container();
          },
        ),
      ),
    );
  }

但请记住,您应该在启动/运行小部件之前执行此操作

通常我像第一种方法一样在开头定义所有 Blocs 和 Cubits .. 在任何其他小部件运行之前的开头。

那是您应该关心的另一件事,但是如果您使用的是 Bloc 而不是 Cubit,那么您是否实现了 Bloc

{ Listener,Builder ..} 在您的小部件中,以便您查看更改

  BlocBuilder<AddNewStudentBloc, AddNewStudentState>(
          builder: (context, state) {
//here you do respond for the state like 
// if State is Error return ErrorWidget
// else if the state is Success return SuccessWidget
// and so on....
return Container(); },
    );
于 2021-04-27T06:38:31.303 回答