我应该在何时何地将值存储在 BLoC 本身或其状态中

Posted

技术标签:

【中文标题】我应该在何时何地将值存储在 BLoC 本身或其状态中【英文标题】:Where and when should I store values in BLoC itself or its state 【发布时间】:2020-12-01 04:45:04 【问题描述】:

上下文

我来自 Redux,正在学习用于全局状态管理的 BLoC 模式。我在定义应该将值作为属性存储在 BLoC 类中的什么位置以及何时应该将值存储在 State 中时遇到了麻烦。

用例

我有一个主页,根据其类别显示一些广告(category 永远不应为空)。我实现了这样的 AdsBloc:

class AdsBloc extends Bloc<AdsEvent, AdsState> 
  final AdsRepository repository;
  AdsBloc(@required this.repository)
      : super(AdsInitial(category: Category.DOGS));

  @override
  Stream<AdsState> mapEventToState(
    AdsEvent event,
  ) async* 
    // my code
  

这些是我的 AdsState:

abstract class AdsState 
  final Category category;
  AdsState(this.category);


class AdsInitial extends AdsState 
  AdsInitial(category) : super(category: category);


class AdsSuccess extends AdsState 
  final PaginatedAds paginatedAds;
  AdsSuccess(this.paginatedAds, category) : super(category: category);


class AdsFailure extends AdsState 
  AdsFailure(category) : super(category: category);

问题

由于我实现模式的方式,每次更改状态时都需要传递category

解决方案?

所以我在想是否可以将类别属性视为 AdsBloc 并将其从状态中删除,这样我可以更好地控制该属性。

【问题讨论】:

嗨,您找到解决方法了吗? 【参考方案1】:

实现“类别”作为触发广告加载过程的事件的参数。这样,例如,您将告诉 BLoC 使用“category: Category.DOGS”来“LoadAds”。

class LoadAds extends AdsEvent 
  final Category category;
  
  LoadAds(
    @required this.category,
  );

  @override
  List<Object> get props => [category];

这样您就可以在需要时使用单个 bloc 实例来加载不同的广告类型。先加载 DOGS,2 分钟后加载 CATS 而不是狗。 如果您不需要这种能力 - 那么在 bloc 内部定义类别就很好了。

【讨论】:

以上是关于我应该在何时何地将值存储在 BLoC 本身或其状态中的主要内容,如果未能解决你的问题,请参考以下文章

Twig 渲染与包含 - 何时何地使用其中一个?

选择何时何地在本地保存数据[关闭]

使用 Dio/bloc Flutter 处理错误

何时何地使用 LINQ to Objects?

SQL 中何时何地使用单引号? [复制]

核心数据:何时何地首先加载实体?