Flutter 从其他 Bloc 监听 Bloc 状态

Posted

技术标签:

【中文标题】Flutter 从其他 Bloc 监听 Bloc 状态【英文标题】:Flutter listen Bloc state from Other Bloc 【发布时间】:2020-03-26 23:07:06 【问题描述】:

您好,我正在尝试从其他 bloc 中侦听 bloc 的状态。 我正在使用这个包https://pub.dev/packages/bloc

从我的 UserBloc 我想听 AuthBloc 并且当它具有状态 AuthenticationAuthenticatedUserBloc 应该触发事件。

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 吗?

【问题讨论】:

你做到了吗,我正在尝试完成类似的事情。 【参考方案1】:

要回答 Sampir 的问题,是的,您是对的,但有时您可能想以另一种方式来回答。 集团是为其他人管理事件的东西。如果您正在使用 ui 事件,您的 bloc 会为您的 ui 管理它们,但如果您还使用其他类型的事件(即位置事件或其他流事件),您可以有一个 bloc 来管理您的 ui 事件和另一个 bloc管理其他类型的事件(即蓝牙连接)。所以第一个块必须听第二个(即因为正在等待建立蓝牙连接)。想想一个使用大量传感器的应用程序,每个传感器都有其数据流,您将拥有一系列必须合作的集团。 您可以使用多提供者和多侦听器来做到这一点,但是您的链可能很长,并且编写您的侦听器案例可能很困难,或者您可能希望将其隐藏在您的 ui 中,或者您想在您的另一部分重用它应用程序,因此您可能希望在您的集团内构建您的链。

您几乎可以在任何地方将侦听器添加到 bloc。使用 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

【讨论】:

我有一个问题,我正在做与你提到的蓝牙连接相同的事情,但对于 WiFi 和蜂窝,我正在使用块,我希望这个块监听连接发生的变化并重建 UI,但在这个我只有一个块使用连接类的方式,但要触发构建我必须使用 UI 中的事件。我想要做的是从观察连接变化的后台线程触发事件。【参考方案2】:

实际上,在bloc library 中的一个examples 中,他们从另一个Bloc (FilteredTodosBloc) 监听一个Bloc (TodosBloc)。

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。

【讨论】:

以上是关于Flutter 从其他 Bloc 监听 Bloc 状态的主要内容,如果未能解决你的问题,请参考以下文章

没有 BLoC 的 Flutter 状态管理

Flutter Bloc 如何从 Widget 本身更新 BlocBuilder 中的 Widget?

在加载 Firebase 快照时使用 Flutter 中的 Bloc 流式等待和阻止其他事件

Flutter,如何将exist Bloc用于其他屏幕?

Flutter Bloc 教程 - 如何显示用户名,即来自其他页面的值

从 v7.2.1 迁移到 flutter_bloc v 8.0.0 后不会触发 flutter_bloc 事件