在底部表 GetX 库中调用 update() 时小部件不更新

Posted

技术标签:

【中文标题】在底部表 GetX 库中调用 update() 时小部件不更新【英文标题】:Widget doesn't update when call update() in bottomsheet GetX Library 【发布时间】:2022-01-09 14:56:27 【问题描述】:

当点击图标时,添加和删除项目不会更新,即使我在 controller() 中调用了 update() 函数

这是我称之为底部表的代码:

Get.bottomSheet(VariantBs(cartItems: cartItem));

这是底页的视图:

Row(
                          children: [
                            GestureDetector(
                              onTap: () 
                                if (amount == 1) 
                                  _dx.deleteItem(cartItems[i].itemId);
                                 else 
                                  _dx.updateQty(cartItems[i].itemId,
                                      cartItems[i].qty - 1);
                                
                              ,
                              child: Icon(
                                Icons.remove_circle,
                                color: AppColor.orange,
                                size: 34,
                              ),
                            ),
                            Container(
                              margin: const EdgeInsets.symmetric(
                                  horizontal: 14, vertical: 0),
                              child: Text(
                                cartItems[i].qty.toString(),
                                style: AppFont.lexendSemiB14Primary,
                              ),
                            ),
                            GestureDetector(
                              onTap: () 
                                _dx.updateQty(
                                    cartItems[i].itemId, cartItems[i].qty + 1);
                               
                              ,
                              child: Icon(
                                Icons.add_circle,
                                size: 34,
                                color: AppColor.orange,
                              ),
                            ),
                            const Spacer(),
                            Text(() 
                              final fmt = MoneyFormatter(
                                  settings: MoneyFormatterSettings(
                                    thousandSeparator: '.',
                                    decimalSeparator: ',',
                                  ),
                                  amount: double.parse(amount.toString()));
                              return 'Rp$fmt.output.withoutFractionDigits';
                            (), style: AppFont.lexendMedium14),
                          ],
                        ),

以及控制器中的功能:

 updateQty(int itemId, int qty) async 
    final api = await _brofoodRepository.updateQty(itemId, qty);

    return api.fold((error) => Get.snackbar('Terjadi Kesalahan', error.data),
        (response) 
      getCart();
      update();
    );
  


 getCart() async 
    final api = await _brofoodRepository.getCart();

    return api.fold((error) => Get.snackbar('Terjadi Kesalahan', error.data),
        (response) 
      if (response.merchantName == "") 
        cart.value = Cart();
       else 
        cart.value = response;
        totalItems.value = 0;
        totalPrice.value = 0;
        for (var element in cart.value.cartItems) 
          totalItems.value += element.qty;
          totalPrice.value += element.price * element.qty;
          if (element.variants == null) 
           else 
            for (var x in element.variants!) 
              for (var y in x.options) 
                totalPrice.value += y.price * element.qty;
              
            
          
        
      
      update();
    );
  

但是当我重新打开底页时,会出现 item 的新值。

对这些问题有任何想法吗?谢谢。

【问题讨论】:

【参考方案1】:

您需要使用GetBuilder 来更新屏幕:

GetBuilder<YourController>(
  builder:(controller)=> Text(
                            controller.cartItems[i].qty.toString(),
                            style: AppFont.lexendSemiB14Primary,
                          ),
)

【讨论】:

我用它作为脚手架主体的子节点,所以get builder是根【参考方案2】:

我也遇到过同样的问题,Getx 的作者在following issue 中描述了这个问题

Flutter 不会重建小部件的所有子级,因此您有两种选择: 1-在模式外使用下拉菜单。 2- 封装你想要改变的小部件,而不是通过 GetBuilder 的模式。

所以我使用了showModalBottomSheet 而不是Get.bottomSheet,如following answer 中所述

showModalBottomSheet(
context: context,
builder: (context) 
  return StatefulBuilder(
      builder: (BuildContext context, StateSetter setState /*You can rename this!*/) 
    return Container(
      height: heightOfModalBottomSheet,
      child: RaisedButton(onPressed: () 
        setState(() 
          heightOfModalBottomSheet += 10;
        );
      ),
    );
  );
);

所以我最终使用了:

setState 用于更新底页 MY_VIEW_CONTROLLER 用于更新父视图中的选定值

【讨论】:

以上是关于在底部表 GetX 库中调用 update() 时小部件不更新的主要内容,如果未能解决你的问题,请参考以下文章

Update Statistics用法

我在 Getx Flutter 中的 null 值错误中使用了 Null 检查运算符

Flutter GetX 状态管理按钮单击

在Oracle触发器中如何执行多条update语句?

Flutter GetX 状态管理不起作用

Flutter 响应式状态管理框架GetX