从其他块接收Flutter监听块状态

dgiusagp  于 2022-11-25  发布在  Flutter
关注(0)|答案(5)|浏览(139)

你好,我正在尝试从其他块监听块的状态。我正在使用这个包https://pub.dev/packages/bloc
从我的UserBloc我要侦听AuthBloc,当它具有状态AuthenticationAuthenticated时,UserBloc应触发事件。

final UserRepository userRepository;
final authBloc;
StreamSubscription authSub;
UserBloc({ @required this.userRepository, @required this.authBloc}) {
    authSub = authBloc.listen((stateAuth) {

      //here is my problem because stateAuth, even is AuthenticationAuthenticated it return always false.
      if (stateAuth is AuthenticationAuthenticated) {
        this.add(GetUser())  ;
      }
    });
  }

@override
  Future<void> close() async {
    authSub?.cancel();
    super.close();
  }

眼下我有这样的问题:在调试中,我尝试打印stateAuth时,它返回:

stateAuth = {AuthenticationAuthenticated} AuthenticationAuthenticated
   props = {_ImmutableList} size = 0

但是stateAuth是AuthenticationAuthenticated返回的总是false。
有没有办法从其他Bloc类监听blocState?

o7jaxewo

o7jaxewo1#

对于那些不想扰乱欧盟的人来说,
我们可以使用这个库Event Bus。它是基于流的。我们可以从屏幕之间的任何地方触发和监听事件。

// declare this globally

EventBus eventBus = EventBus();

// create event
class UserLoggedInEvent {
  User user;

  UserLoggedInEvent(this.user);
}

// listen event
eventBus.on<UserLoggedInEvent>().listen((event) {
  // All events are of type UserLoggedInEvent (or subtypes of it).
  print(event.user);
});

// fire event
User myUser = User('Mickey');
eventBus.fire(UserLoggedInEvent(myUser));
nle07wnf

nle07wnf2#

实际上在其中一个examplesbloc library中它们监听一个Bloc(TodosBloc)来自另一个Bloc(FilteredTodosBloc)。

class FilteredTodosBloc extends Bloc<FilteredTodosEvent, FilteredTodosState> {
  final TodosBloc todosBloc;
  StreamSubscription todosSubscription;

  FilteredTodosBloc({@required this.todosBloc}) {
    todosSubscription = todosBloc.listen((state) {
      if (state is TodosLoadSuccess) {
        add(TodosUpdated((todosBloc.state as TodosLoadSuccess).todos));
      }
    });
  }
...

您可以查看此示例的说明here

ckocjqey

ckocjqey3#

为了回答Sampir的问题,是的,你是对的,但是有时候你可能想用另一种方式来做。一个块是为别人管理一个事件的东西。如果你正在使用ui事件,你的块为你的ui管理它们,但是如果你也在使用其他类型的事件(即位置事件,或其他流事件),您可以有一个块来管理您的ui事件,另一个块管理其他类型的事件。(即蓝牙连接)。因此,第一个块必须监听第二个块(IidoEe.因为正在等待建立蓝牙连接)想想一个应用程序,它使用了很多传感器,每个传感器都有它的数据流,你可以通过多提供者和多监听器来实现,但是你的链可能很长,编写监听器用例可能很困难,或者你可能想对你的用户界面隐藏它,或者你想在你的应用的其他部分重用它,因此您可能希望在块内构建链。
你几乎可以在任何地方添加一个监听器到一个块。使用StreamSubscription,你可以添加一个监听器到每一种流,甚至是另一个块中的流。块必须有一个方法来公开他的流,这样你就可以监听他。
一些代码(我使用flutter_bloc - flutter_bloc有多个提供者,但这只是举例):

class BlocA extends Bloc<EventA, StateA> {

  final BlocB blocB;
  StreamSubscription subscription;

  BlocA({this.blocB}) {
    if (blocB == null) return;
    subscription = blocB.listen((stateB) {
      //here logic based on different children of StateB
    });
  }

  //...

}

class BlocB extends Bloc<EventB, StateB> {
   //here BlocB logic and activities
}
czfnxgou

czfnxgou4#

最近在块源代码中的更新需要对解决方案进行一个小的更改。
你现在必须监听一个块/肘的流属性,请看下面的例子。

class FilteredTodosBloc extends Bloc<FilteredTodosEvent, FilteredTodosState> {
  final TodosBloc todosBloc;
  StreamSubscription todosSubscription;

  FilteredTodosBloc({@required this.todosBloc}) {
    todosSubscription = todosBloc.stream.listen((state) {
    //                             ^^^^^
      if (state is TodosLoadSuccess) {
        add(TodosUpdated((todosBloc.state as TodosLoadSuccess).todos));
      }
    });
  }
...
mepcadol

mepcadol5#

您可能不希望您的块依赖于具有直接块到块依赖性的另一个块,相反,您可能希望通过表示层连接您的块。
您可以使用BlocListener侦听一个块,并在第一个块更改时将事件添加到另一个块。

class MyWidget extends StatelessWidget {
  const MyWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return BlocListener<WeatherCubit, WeatherState>(
      listener: (context, state) {
        // When the first bloc's state changes, this will be called.
        //
        // Now we can add an event to the second bloc without it having
        // to know about the first bloc.
        BlocProvider.of<SecondBloc>(context).add(SecondBlocEvent());
      },
      child: TextButton(
        child: const Text('Hello'),
        onPressed: () {
          BlocProvider.of<FirstBloc>(context).add(FirstBlocEvent());
        },
      ),
    );
  }
}

上面的代码防止SecondBloc需要了解FirstBloc,从而鼓励松散耦合。
查看官方文档以了解更多信息。

相关问题