如何在颤动中将购物车屏幕中的项目计数更新到餐厅详细信息屏幕并返回到餐厅详细信息屏幕?

时间:2021-06-23 05:07:33

标签: flutter dart flutter-layout flutter-widget flutter-listview

我正在开发一个送餐应用,用户在该应用中点击从 restaurantDetail 屏幕添加商品并将商品添加到购物车。当用户更改特定项目计数时在购物车屏幕中。我想在 restaurantDetail 屏幕上更新每个项目的相同项目计数?

我正在从购物车列表的回调中传递整个购物车列表,并在 restaurantDetail 屏幕上获取相同的列表。如何更新其中的项目计数?

在回调中,我返回这个函数,并以一个 total 和 callbackFromCart 作为参数。

final Function(double, List<CartModel>) callbackFromCart;

在 RestaturantDetailScreen 上,我在以下函数中得到相同的结果:

onCartBackPress(totalPriceFromCart, List<CartModel> _listFromCartItem) {
print("LIST FROM CART :${_listFromCartItem}");
for (var item in _listFromCartItem) {
  for (var mainrestaurantItem in _itemList) {
    if (mainrestaurantItem.id == item.restaurantItemId) {
      mainrestaurantItem.totalQty = item.totalQty;
      updatedItemCount = mainrestaurantItem.totalQty;
      print("UPDATED ITEM COUNT : $updatedItemCount");
    }
  }
}
setState(() {
  _totalPrice = totalPriceFromCart;
});
print(_itemList);
if (_listFromCartItem.isEmpty == true) {
  getRestaurantDetail();
}

}

1 个答案:

答案 0 :(得分:0)

class _RestaurantState extends State<RestaurantPage> {
  
  StreamController<List<YourItemModel> itemsController = StreamController<List<YourItemModel>>();
  List<YoutItemModel> itemsList = [];
  
  @override
  Widget build(BuildContext context) {
    .....
      
      StreamBuilder<List<YourItemModel>(
      stream: itemsController.stream,
      builder: (con, data){
       //check for loading or empty data here
       //else return listview
       return ListView.builder(
        ......
       );
      }
      
      ),
      
    .....
      
      override
      void dispose(){
      itemsController.close();
      super.dispose();
    }
  }
  
  void gotoCartPage() async {
    
    List<YourItemModel> newList = await Navigator.push(
    context, builder: (c)=> CartPage(items: itemsList));
    
    if(newList != null){
      itemsList.clear();
      itemsList.addAll(newList);
      itemsController.sink.add(itemsList);
    }
  }
  
}

  // In CartPage
  
  class CartPage extends StatefulWidget{
    
    final List<YourItemModel> list;
    CartPage({Key k, required this.list}) : super(key:k);
    
    @override
  _CartPageState createState() => _CartPageState(list);
    
  }
  
  class _CartPageState extends State<CartPage> {
    _CartPageState(this.modifiedList);
    
    List<YourItemModel> modifiedList;
  
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: (){
        Navigator.of(context).pop(modifiedList);
        return Future.value(true);
      },
      child: Scaffold(
       //Increase or decrease your items from itemsList in CartPage
       //and return modified list to the parent/restaurant screen
      .....
      ),
     );
  }
 }