【问题标题】:Flutter bloc fill initial state with dataFlutter bloc 用数据填充初始状态
【发布时间】:2021-02-22 22:59:43
【问题描述】:

可以这么说,我有一个关于 bloc 正确代码放置的问题。 因此,由于 bloc 代表业务逻辑组件,我已经将业务逻辑(如处理数据方法)移到了类中。所以现在有两种方法,一种用于获取数据,另一种用于保存数据。 接下来,我的组件在AddInitial 中应该显示加载,然后触发块说“嘿,我需要这里的数据”。它是正确的还是反模式?代码如下所示。

BlocBuilder<AddBloc, AddState>(
  buildWhen: (previous, current) {
    // code is ommited
  },
  builder: (context, state) {
    if (state is ExpensesLoaded || state is CategoryChanged) {
      // code is ommited
    } else if (state is ExpensesLoading) {
      return getProgressSpinner();
    } else if (state is AddInitial) {
      // is it ok? If it's antipattern please give an advise how to do it correctly
      context.bloc<AddBloc>().add(CategoryChange([category]));
      return getProgressSpinner();
    } else {
      print('Bloc Loaded. Nothing to show inside Month Expenses...');
      return Container();
    }
  }

关于context.bloc&lt;AddBloc&gt;().add(CategoryChange([category]));的问题。是反模式吗?这应该怎么做?

顺便说一句,当它看起来像这样。下次当我将 CategoryChange 事件添加到 bloc(这将产生 CategoryChanged 状态)时,上面的构建器由于某种原因没有反应......

谢谢!

我使用的是 Flutter 1.22.3,flutter_bloc: 6.1.0

【问题讨论】:

    标签: flutter dart bloc flutter-bloc


    【解决方案1】:

    这应该怎么做?

    如果您在创建 Bloc 时知道了 Bloc 的初始状态(假设是一个静态列表,默认情况下预先选择了第一个条目),那么您可以使用 Bloc 构造函数,该构造函数将该初始状态作为参数。

    如果您不知道正确的初始状态是什么,因为它是动态的(假设是从基于 GPS 的服务加载的位置列表,用户必须同意通过按钮点击获得,因为它需要花钱)那么有一个“空”或“未初始化”或“waitingForUserInteraction”状态是完全可以的。毕竟,那就是你程序的状态。

    顺便说一句,当它看起来像这样。下次当我将 CategoryChange 事件添加到 bloc(这将产生 CategoryChanged 状态)时,上面的构建器由于某种原因没有反应

    bloc 通过比较新旧状态来判断是否发出新的状态变化。如果要修改默认行为,可以确保两个状态比较相等(或不相等)。最简单的方法是从包equatable 中的Equatable 中获取您的状态,如下所示:

    @immutable
    abstract class SomeState extends Equatable {
      final String importantChange;
      final String unimportantChange;
    
      const SomeState(this.importantChange, this.unimportantChange);
    
      @override
      List<Object> get props => [importantChange]; 
    }
    

    只在“props”列表中列出一个字段意味着在比较相等性时只比较这个字段。如果importantChange 相等,则状态被视为相等(并且不会从 Bloc 发出)。具有相同importantChange 但不同unimportantChange 的两个状态被认为是相同的。

    【讨论】:

    • 谢谢。这里有一点不同的逻辑。实际上它是你写的所有东西的混合。我想显示带有几个已完成小部件的屏幕,并且一个小部件将从加载程序开始(同时将触发 db 请求)。 db 将响应后,应更新相关的小部件
    猜你喜欢
    • 2021-02-12
    • 2021-02-10
    • 2021-03-19
    • 2020-05-06
    • 2020-02-21
    • 2020-12-09
    • 2019-10-24
    • 2021-07-21
    • 2020-07-09
    相关资源
    最近更新 更多