gpt4 book ai didi

flutter - 如何在 Flutter Cubit 中使用 StreamSubscription

转载 作者:行者123 更新时间:2023-12-05 06:47:21 24 4
gpt4 key购买 nike

我遇到了一个问题,即对 cubit 的流订阅不监听 cubit 的发射状态。这是我如何在我的代码中实现它们的示例。

这是我想听的肘

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();
}
}

之后,我调用了 ButtonPressCubit emitButtonOnePressed(),如下所示。

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

但这行不通。如何修复它以获得肘的状态。

最佳答案

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

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

首先:如果您有多个 Bloc 或

 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(); },
);

关于flutter - 如何在 Flutter Cubit 中使用 StreamSubscription,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67137656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com