0

在这里,我使用了非常简单的HookWidgetand Riverpod,当我调用一些方法时,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不触发屏幕,我尝试同时使用 usingConsumer和 not using Consumer。在任何时候屏幕都无法重建

4

1 回答 1

1

在方法中尝试在List<SelectedProductServices>这里创建类似的新实例:

  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<SelectedProductServices>使用DeepCollectionEquality,但是当您直接使用 List 对象时,您只能在内存中创建一个具有不同引用的新列表,以便 oldState!=newState

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

于 2021-08-21T16:30:21.313 回答