управлять состояниями на флаттере для торговой площадки - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать торговую площадку на приложении flutter, управляемом дротиком состояния, поэтому, когда пользователь выбирает продукт, состояние меняется с пустого на загруженное, я копирую диаграмму потока за ним.

введите описание изображения здесь

Проблема в том, что после выбора продуктов, когда я перехожу со страницы продуктов на страницу карт, состояние снова становится пустым, а продукты вообще не отображаются.

После нажатия продукт, он переходит в магазинный карт blo c и выполняет следующую функцию.

Stream<ShoppingState> _mapAddItemToState(Product product) async* {
  //yield ShoppingState.loading();
 try {
  final List<PackItem> packItemList = List.from(state.packItemList);
  packItemList.add(PackItem(title: product.title, detail: product.detail, price: product.price,));
  yield state.update(isItemAdded: state.isItemAdded);
  yield ShoppingState.itemAdded(packItemList);
  //yield state.update(packItemList: packItemList);
  yield ShoppingState.loaded(packItemList);
 } catch (packItemList) {
  print(packItemList);
}

В состоянии торгового карт dart у нас есть:

part of 'e_commerce_bloc.dart';

@immutable
class ShoppingState {
 final bool isItemAdded;
 final bool isItemRemoved;
 final bool isCartLoading;
 final bool isCartLoaded;
 final bool isCartEmpty;
 final List<PackItem> packItemList;

ShoppingState({
 this.isItemAdded,
 this.isItemRemoved,
 this.isCartLoading,
 this.isCartLoaded,
 this.isCartEmpty,
 this.packItemList
});
factory ShoppingState.empty() {
 return ShoppingState(
  isItemAdded: false,
  isItemRemoved: false,
  isCartLoading: false,
  isCartLoaded: false,
  isCartEmpty: true,
  packItemList: []
 );
}
factory ShoppingState.loading(){
 return ShoppingState(
  isItemAdded: true,
  isItemRemoved: true,
  isCartLoading: true,
  isCartLoaded: false,
  isCartEmpty: false
 );
}
factory ShoppingState.itemAdded(List<PackItem> packItemList) {
 return ShoppingState(
  isItemAdded: true,
  isItemRemoved: false,
  isCartLoading: false,
  isCartLoaded: false,
  isCartEmpty: false,
  packItemList: packItemList
 );
}
factory ShoppingState.itemRemoved() {
 return ShoppingState(
  isItemAdded: false,
  isItemRemoved: true,
  isCartLoading: false,
  isCartLoaded: false,
  isCartEmpty: false
 );
}
factory ShoppingState.loaded(List<PackItem> packItemList) {
 return ShoppingState(
  isItemAdded: false,
  isItemRemoved: false,
  isCartLoading: false,
  isCartLoaded: true,
  isCartEmpty: false,
  packItemList: packItemList,
 );
}
ShoppingState update({
 bool isItemAdded,
 bool isItemRemoved,
 List<PackItem> packItemList,
}){
return copyWith(
  isItemAdded: isItemAdded,
  isItemRemoved: isItemRemoved,
  packItemList: packItemList,
  isCartLoading: false,
  isCartLoaded: false,
  isCartEmpty: false
 );
}
ShoppingState copyWith({
 bool isItemAdded,
 bool isItemRemoved,
 bool isCartLoading,
 bool isCartLoaded,
 bool isCartEmpty,
 List<PackItem> packItemList,
}) {
return ShoppingState(
  isItemAdded: isItemAdded ?? this.isItemAdded,
  isItemRemoved: isItemRemoved ?? this.isItemRemoved,
  isCartLoading: isCartLoading ?? this.isCartLoading,
  isCartLoaded:  isCartLoaded ?? this.isCartLoaded,
  isCartEmpty: isCartEmpty ?? this.isCartEmpty,
  packItemList:  packItemList ?? this.packItemList
);
}

@override 
String toString() {
 return '''ShoppingState{
  isItemAdded: $isItemAdded,
  isItemRemoved: $isItemRemoved,
  isCartLoading: $isCartLoading,
  isCartLoaded: $isCartLoaded,
  isCartEmpty: $isCartEmpty,
  packItemList: ${packItemList.length}
 }''';
}
}

И на странице Карт У меня есть:

 child: BlocBuilder<ShoppingBlock, ShoppingState>(
  builder: (BuildContext context, ShoppingState state) {
   print(state);
   if (state.isCartLoading) {
    return Center(child: CircularProgressIndicator());
   }
   if (state.isCartLoaded) {
    return ListView.builder(
        itemCount: state.packItemList.length,
        itemBuilder: (BuildContext context, int index) {
          state.packItemList.forEach((item) { 
            return ListTile(
              title: Text(item.title[index]),
              subtitle: Text(item.detail[index]),
              trailing: Text(item.price[index]),
          );
         });
         return ListView(children: state.packItemList);   
        });         
       }
       return Center(child: Text('No has agregado items'));
     },
   )

Но вместо того, чтобы возвращать состояние корзины «Загружена», он возвращает состояние, пустое от состояния корзины покупок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...