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(),但我找不到一个解决方法来让我的业务逻辑正常工作