【问题标题】:is Flutter bloc always must have one property(data)是 Flutter bloc 总是必须有一个属性(数据)
【发布时间】:2022-01-02 22:31:52
【问题描述】:

我是一个以 bloc 作为状态管理的 Flutter 项目的工作人员。

但我的屏幕包含各种各样的数据。

如何管理所有这些数据?

class ProductCubit extends Cubit<ProductState> {
  Worker worker = Worker();
  List<ProductMakePriceChange> productsPriceChange = [];
  List<PurchaseCount> purchaseCount = [];
  int productCount = 0;
  int productSaleCount = 0;
  int productCategoryCount = 0;
  int productUnitCount = 0;
}

每个数据都有一个状态(加载状态) 并且每个数据都有一种加载方法

问题!

当一个状态改变时,所有屏幕都重建

我只需要从我的屏幕上更改一个分区,当该数据生效时只更改那个分区

【问题讨论】:

    标签: flutter mobile bloc cubit


    【解决方案1】:

    有几种方法可以实现这一点。

    正如您猜对的,您当然可以将一些字段移动到不同的肘部。另一种选择是实现ProductState 的不同子类,并在运行时检查BlocBuilderBlocConsumer 中的类型。

    class ProductCubit extends Cubit<ProductState> {
      ProductCubit()
          : super(
              const ProductInitial(
                ProductInfo(
                  productsPriceChange: [],
                  purchaseCount: [],
                  productSaleCount: 0,
                  productCategoryCount: 0,
                  productCount: 0,
                  productUnitCount: 0,
                ),
              ),
            );
    
      Future<void> loadProductPurchaseCount() async {
        emit(ProductPurchaseCountLoadInProgress(state.productInfo));
        try {
          // TODO load product purchase count
          final productPurchaseCount = <dynamic>[];
          emit(
            ProductPurchaseCountLoadSuccess(
              state.productInfo.copyWith(
                purchaseCount: productPurchaseCount,
              ),
            ),
          );
        } catch (_) {
          emit(
            ProductPurchaseCountLoadSuccess(state.productInfo),
          );
        }
      }
    }
    
    abstract class ProductState extends Equatable {
      const ProductState(this.productInfo);
    
      final ProductInfo productInfo;
    
      @override
      List<Object?> get props => [productInfo];
    }
    
    class ProductInitial extends ProductState {
      const ProductInitial(ProductInfo productInfo) : super(productInfo);
    }
    
    class ProductPurchaseCountLoadInProgress extends ProductState {
      const ProductPurchaseCountLoadInProgress(ProductInfo productInfo)
          : super(productInfo);
    }
    
    class ProductPurchaseCountLoadFailure extends ProductState {
      const ProductPurchaseCountLoadFailure(ProductInfo productInfo)
          : super(productInfo);
    }
    
    class ProductPurchaseCountLoadSuccess extends ProductState {
      const ProductPurchaseCountLoadSuccess(ProductInfo productInfo)
          : super(productInfo);
    }
    

    最后但同样重要的是,有一个名为BlocSelector 的相对较新的小部件,可让您检查状态以确定是否应该构建子级。

    BlocSelector<BlocA, BlocAState, SelectedState>(
      selector: (state) {
        // return selected state based on the provided state.
      },
      builder: (context, state) {
        // return widget here based on the selected state.
      },
    )
    

    查看文档:https://pub.dev/packages/flutter_bloc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 2021-05-17
      • 2017-07-22
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多