Flutter 调用setState()或markNeedsBuild()的小部件是:_InheritedProviderScope<;配置提供商>;错误

Flutter 调用setState()或markNeedsBuild()的小部件是:_InheritedProviderScope<;配置提供商>;错误,flutter,dart,flutter-web,provider,stream-builder,Flutter,Dart,Flutter Web,Provider,Stream Builder,我有以下代码片段: FutureBuilder( future: Provider.of<ConfigProvider>(context, listen: false).fetchConfig(), builder: (ctx, dataSnapshot) { if (dataSnapshot.connectionState == ConnectionState.waiting) { ret

我有以下代码片段:

FutureBuilder(
          future:  Provider.of<ConfigProvider>(context, listen: false).fetchConfig(),
          builder: (ctx, dataSnapshot) {
            if (dataSnapshot.connectionState == ConnectionState.waiting) {
              return Expanded(
                child: Center(
                  child: CircularProgressIndicator(),
                ),
              );
            } else {
              if (dataSnapshot.error != null) {
                // TODO handling errors
                return Center(
                  child: Text('An error occurred!'),
                );
              } else {
                return StreamBuilder(
                  stream: channel.stream,
                  builder: (context, snapshot) {
                    if(snapshot.hasError) {
                      // TODO handling errors
                      return Center(
                        child: Text('An error occurred!'),
                      );
                    }
                    if(snapshot.hasData) {
                      Map<String, dynamic> decodedData = Map<String, dynamic>.from(jsonDecode(snapshot.data));
                      if(decodedData['eventType'] == 'widget-update') {
                        Provider.of<ConfigProvider>(context, listen: false).updateWidget(decodedData);
                      }
                    }
                    return Consumer<ConfigProvider>(
                      builder: (ctx, configProvider, child) {
                        return WidgetsList(
                          boardWidgets: configProvider.boardWidgets,
                          dashboardType: dashboardTabs[dashboardsProvider.dashboardTabIndex].dashboardType,
                        );
                      }
                    );
                  },
                );
              }
            }
          },
        ),
FutureBuilder(
future:Provider.of(context,listen:false).fetchConfig(),
建造商:(ctx、dataSnapshot){
if(dataSnapshot.connectionState==connectionState.waiting){
扩大回报(
儿童:中心(
子对象:CircularProgressIndicator(),
),
);
}否则{
如果(dataSnapshot.error!=null){
//TODO处理错误
返回中心(
子项:Text('发生错误!'),
);
}否则{
返回流生成器(
stream:channel.stream,
生成器:(上下文,快照){
if(snapshot.hasError){
//TODO处理错误
返回中心(
子项:Text('发生错误!'),
);
}
if(snapshot.hasData){
Map decodedData=Map.from(jsonDecode(snapshot.data));
if(decodedData['eventType']=='widget update'){
Provider.of(context,listen:false).updateWidget(decodedData);
}
}
退货消费者(
生成器:(ctx、configProvider、子级){
返回WidgetsList(
boardWidgets:configProvider.boardWidgets,
仪表板类型:仪表板选项卡[dashboardsProvider.dashboardTabIndex]。仪表板类型,
);
}
);
},
);
}
}
},
),
代码段背后的想法是,首先在应用程序启动时获取一次带有小部件列表的配置,然后收听websocket获取小部件更新,每次有小部件更新从套接字输入时,我都要更新configProvider中小部件列表中的具体小部件。但每次执行这一行时:

Provider.of<ConfigProvider>(context, listen: false).updateWidget(decodedData);
Provider.of(context,listen:false).updateWidget(decodedData);
(每次updateWidget(decodedData)中的notifyListeners()发生错误时,应用程序如果抛出错误:

无法标记此_InheritedProviderScope小部件 因为框架已经在开发过程中,所以需要构建 构建小部件。小部件可以标记为需要构建 在构建阶段,仅当其一个祖先当前 建筑。此异常是允许的,因为框架生成 父窗口小部件位于子窗口小部件之前,这意味着脏的子窗口小部件将 总是要建造。否则,框架可能不会访问此小部件 在这个构建阶段。在其上设置setState()或 调用的markNeedsBuild()为:
_InheritedProviderScope发出违规调用时当前正在生成的小部件为:
StreamBuilder

所以我知道我不能在StreamBuilder中的builder内执行notifyListeners(),但我找不到一个解决方法来让我的业务逻辑正常工作