Добавление товара в список работает хорошо. Я хочу отобразить сохраненный список товаров в другом виджете. Но если я вернусь на home_screen, список продуктов сбрасывается. Как это решить?
class ProductUi extends StatelessWidget {
ProductTest productTest;
ProductUi(this.productTest);
@override
Widget build(BuildContext context) {
final productBloc = BlocProvider.of<ProductBloc>(context);
return Scaffold(
body: Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(productTest.name),
RaisedButton(
onPressed: () {
productBloc.add(AddToCart(productTest: productTest));
},
child: Text('add to cart'),
),
],
),
)),
);
}
}
Функция
class CartService {
List<ProductTest> cartProduct = [];
Future addProduct(ProductTest productTest) async {
return cartProduct.add(productTest);
}
}
ProductBlo c
class ProductBloc extends Bloc<ProductEvent, ProductState> {
CartService cartService = CartService();
ProductBloc({@required this.cartService});
@override
ProductState get initialState => ProductInitial();
@override
Stream<ProductState> mapEventToState(ProductEvent event) async* {
if (event is AddToCart) {
await cartService.addProduct(event.productTest);
}
}
}
ProductEvent
class AddToCart extends ProductEvent {
ProductTest productTest;
AddToCart({this.productTest});
@override
List<Object> get props => [];
}
Главный экран, Категория, ProductList
class HomeScreenTest extends StatefulWidget {
@override
_HomeScreenTestState createState() => _HomeScreenTestState();
}
class _HomeScreenTestState extends State<HomeScreenTest> {
CartService cartService = CartService();
@override
Widget build(BuildContext context) {
return Scaffold(
body: CategoryTest(),
);
}
}
class CategoryTest extends StatefulWidget {
@override
_CategoryTestState createState() => _CategoryTestState();
}
class _CategoryTestState extends State<CategoryTest> {
CartService cartService = CartService();
@override
Widget build(BuildContext context) {
BlocProvider.of<ProductBloc>(context)..add(LoadCategoriesEvent());
return Scaffold(
body: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.fromLTRB(20, 15, 20, 15),
child: Column(
children: <Widget>[
BlocBuilder<ProductBloc, ProductState>(
builder: (context, state) {
if (state is ProductLoaded) {
return categoryColumn(
state.categoriesTest, state.productTest);
} else {
return Container();
}
},
)
],
),
),
),
);
}
Widget categoryColumn(
List<CategoriesTest> categoriesTest, List<ProductTest> productTest) {
return Column(
children: categoriesTest.map((category) {
return Card(
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BlocProvider(
create: (context) =>
ProductBloc(cartService: cartService),
child: ProductList(
categoriesTest: category,
))));
},
child: Container(
padding: EdgeInsets.all(20),
child: Column(
children: <Widget>[
Text(
category.categoryname,
),
],
),
),
),
);
}).toList(),
);
}
class ProductList extends StatefulWidget {
CategoriesTest categoriesTest;
ProductList({@required this.categoriesTest});
@override
_ProductListState createState() => _ProductListState();
}
class _ProductListState extends State<ProductList> {
CartService cartService = CartService();
@override
Widget build(BuildContext context) {
BlocProvider.of<ProductBloc>(context)..add(LoadProductListEvent());
return Scaffold(
body: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.fromLTRB(20, 30, 20, 15),
child: Column(
children: <Widget>[
BlocBuilder<ProductBloc, ProductState>(
builder: (context, state) {
if (state is ProductListLoaded) {
return tableListColumn(
state.productTest, widget.categoriesTest);
} else {
return Container();
}
},
)
],
),
),
),
);
}
Widget tableListColumn(
List<ProductTest> productTest, CategoriesTest categoriesTest) {
return Column(
children: productTest
.where((product) => product.category == categoriesTest.categoryname)
.map((product) {
return Card(
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BlocProvider(
create: (context) =>
ProductBloc(cartService: cartService),
child: ProductUi(product))));
},
child: Container(
padding: EdgeInsets.all(15),
child: Column(
children: <Widget>[
Image.network(product.image),
Text(product.name),
],
),
),
),
);
}).toList(),
);
}
}
Между виджетом «Категория» и виджетом «ProducList» список продуктов не сбрасывается.