【问题标题】:Flutter HookWidget doesn't rebuild when values changed当值更改时,Flutter HookWidget 不会重建
【发布时间】:2021-08-21 14:59:31
【问题描述】:

这里我使用了非常简单的HookWidgetRiverpod,当我调用StateNotifierProvider 的一些方法例如increment 我希望我使用useProvider 的小部件再次重建,例如:

class MyHomePage extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final _orderProvider = useProvider(orderStateNotifierProvider.notifier);
    final List<SelectedProductServices> _serviceList = _orderProvider.getServices();
    return Scaffold(
        appBar: AppBar(
          title: Text('test'),
        ),
        body: Center(
          child:
          Consumer(
            builder: (_, watch, __) {
              return Column(
                children: <Widget>[
                  //...
                    GestureDetector(
                      onTap: () => _orderProvider.increment(productId: 1, serviceId: 1),
                      child: Container(
                          width: 200.0,
                          height: 50.0,
                          child: Text('ADD')),
                    )
                 //...
                ],
              );
            },
          ),
        ));
  }
}

点击按钮increment 后在这里工作正常,但_orderProvider 不会触发屏幕,我尝试同时使用Consumer 和不使用Consumer。在任何时候屏幕都无法重建

【问题讨论】:

    标签: flutter dart riverpod hook-widgets


    【解决方案1】:

    在方法中尝试创建List&lt;SelectedProductServices&gt; 的新实例,如下所示:

      void increment({int productId,int serviceId}) {
        state = [// Generate a new list with current items in state
          for (final selectedService in state)
            if (selectedService.id == productId&&selectedService.sId==serviceId) 
              SelectedProductServices(
               //Create a new object with the updated internal state
              )
            else
              selectedService,
        ];
      }
    

    Dart 通过引用而不是值来比较它的对象,当你改变 List 的内部状态时,它在内存中占用的引用是相同的,无论它拥有多少项目。 如果列表保存在一个类中,您可以覆盖 == 方法以使用 List&lt;SelectedProductServices&gt; 比较 DeepCollectionEquality 但是当您直接使用 List 对象时,您只能在内存中创建一个具有不同引用的新列表,所以那个 oldState!=newState

    注意:您应该使所有修改内部状态以及您想要更新 UI 并通知其侦听器的方法都像上面那样工作。

    【讨论】:

    猜你喜欢
    • 2020-05-24
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2014-08-30
    相关资源
    最近更新 更多