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

Posted

技术标签:

【中文标题】如何在颤动中将商品计数从购物车屏幕更新到餐厅详细信息屏幕并返回到餐厅详细信息屏幕?【英文标题】:How to update item count from cartscreen to and back to restaurant detail screen in flutter? 【发布时间】:2021-09-06 15:40:18 【问题描述】:

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

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

在回调中,我将返回此函数,并将总和 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();

【问题讨论】:

您应该考虑实现应用状态管理小部件,例如provider 【参考方案1】:
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
      .....
      ),
     );
  
 

【讨论】:

以上是关于如何在颤动中将商品计数从购物车屏幕更新到餐厅详细信息屏幕并返回到餐厅详细信息屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

颤动中从孩子到父母的回调

如何在颤动中将数据从一个小部件传递到另一个小部件?

如何修复在空颤动上调用的方法“包含密钥”[重复]

如何在颤动中将浏览器 URL 更新为非根导航器的路由更改?

如何在颤动中将数据从复选框存储到 Firebase

将商品添加到购物车,该商品已经添加了另一个计数