首页 > 解决方案 > 如何在使用 providerListener 的消费者中打开状态通知器时获取数据列表。扑

问题描述

  titleColor: Colors.black,
    resizeToAvoidBottomInset: false,
    backgroundColor: Colors.white,
    body: ProviderListener(
        provider: addressNotifierProvider.state,
        onChange: (context, state) {
          if (state is AddressInitial) {
            print("hello");
            context
                .read(addressNotifierProvider)
                .fetchUserAddress(widget.addressIds);
          }
        },
        child: Consumer(
          builder: (context, watch, child) {
            final state = watch(addressNotifierProvider.state);
            print(state);
            if(state is AddressInitial){
              context
                  .read(addressNotifierProvider)
                  .fetchUserAddress(widget.addressIds);
            }
            if (state is AddressFetchedDetails) {
              return SingleChildScrollView(
                  child: Container(
                      color: Colors.white,
                      padding: EdgeInsets.only(

一旦页面打开,这就会给我错误 Unhandled Exception: setState() or markNeedsBuild() 在构建期间调用。如何解决这个问题。

标签: flutterstateriverpodflutter-change-notifier

解决方案


fetchUserAddress操作改变了小部件的状态(我猜是因为手表)。状态更改会触发重建。但是正如错误所解释的那样,您不能在构建操作期间触发重建。

要解决这个问题,您应该重新考虑您的状态管理架构。

但是,作为一种解决方法,您可以将所有状态更改调用包装在渲染后帧回调中。

WidgetsBinding.instance
        .addPostFrameCallback((_) => context
                  .read(addressNotifierProvider)
                  .fetchUserAddress(widget.addressIds) );

推荐阅读