状态不变(停留在初始状态)

时间:2019-12-11 06:09:13

标签: flutter

最近我正在学习有关bloc_pattern的知识,所以我遵循了https://medium.com/flutter-community/implementing-bloc-pattern-for-parsing-json-from-api-5ac538d5179f

这是我的剧本

我的Bloc文件

class HotProductBloc extends Bloc<HotProductEvent, HotProductState> {
  HotProductRepository repository;

  HotProductBloc({@required this.repository});

  @override
  HotProductState get initialState => InitialHotProductsState();

  @override
  Stream<HotProductState> mapEventToState(HotProductEvent event) async* {
    print(event);
    if (event is FetchHotProductEvent) {
      yield HotProductsLoading();
      try {
        List<HotProducts> dataHotProduct = await repository.getHotProduct();
        yield HotProductsLoaded(hotproduct: dataHotProduct);
      } catch (e) {
        yield HotProductsError(message: e.toString());
      }
    }
  }
}

存储库文件

abstract class HotProductRepository {
  Future<List<HotProducts>> getHotProduct();
}

class HotProductImplement implements HotProductRepository {
  @override
  Future<List<HotProducts>> getHotProduct() async {
    print("running");
    final response = await http.post(Configuration.url + "api/getHotProducts",
        body: {"userId": "abcde"});
    if (response.statusCode == 200) {
      var data = json.decode(response.body);
      List<dynamic> responseData = jsonDecode(response.body);
      final List<HotProducts> hotProducts = [];
      responseData.forEach((singleUser) {
        hotProducts.add(HotProducts(
          productId: singleUser['productId'],
          isNew: singleUser['isNew'],
          productName: singleUser['productName'],
          isHot: singleUser['isHot'],
          productImage: singleUser['productImage'],
          categoryId: singleUser['categoryId'],
          productPrice: singleUser['productPrice'],
          productDescription: singleUser['productDescription'],
          isLiked: singleUser['isLiked'],
          image1: singleUser['image1'],
          image2: singleUser['image2'],
          image3: singleUser['image3'],
          productColorId: singleUser['productColorId'],
        ));
      });
      return hotProducts;
    } else {
      throw Exception();
    }
  }

事件文件

abstract class HotProductEvent extends Equatable {
  HotProductEvent([List props = const []]) : super(props);
}

class FetchHotProductEvent extends HotProductEvent {
  @override
  List<Object> get props => null;
}

状态文件

abstract class HotProductState extends Equatable {
  HotProductState([List props = const []]) : super(props);
}

class InitialHotProductsState extends HotProductState {}

class HotProductsLoading extends HotProductState {}

class HotProductsLoaded extends HotProductState {
  final List<HotProducts> hotproduct;

  HotProductsLoaded({@required this.hotproduct})
      : assert(hotproduct != null),
        super([hotproduct]);
}

class HotProductsError extends HotProductState {
  String message;
  HotProductsError({@required this.message});
  @override
  // TODO: implement props
  List<Object> get props => [message];
}

这是我实现集团的方法

BlocListener <HotProductBloc, HotProductState>(
              listener: (context, state) {
                if (state is HotProductsError) {
                  Scaffold.of(context).showSnackBar(
                    SnackBar(
                      content: Text(state.message),
                    ),
                  );
                }
              },
              child: Container(
                child: BlocBuilder<HotProductBloc, HotProductState>(
                  builder: (context, state) {
                    print("BLoc State "+ state.toString());
                    if (state is InitialHotProductsState) {
                      return Text("Siaaap");
                    } else if (state is HotProductsLoading) {
                      return Text("Loading");
                    } else if (state is HotProductsLoaded) {
                      return Text("DONE");
                    } else if (state is HotProductsError) {
                      return Text("ERROR");
                    }else{
                      return Text("Unknown error");
                    }
                  },
                ),
              ),
            ),

当我在上面运行脚本时,我会在日志中得到

  

I / flutter(390):BLoc状态InitialHotProductsState I / flutter(   390):BLoc状态InitialHotProductsState

1 个答案:

答案 0 :(得分:1)

您需要触发一个事件以开始任何状态更改。尝试将其添加到build()方法中的某个位置:

BlocProvider.of<HotProductBloc>(context).add(FetchHotProductEvent());