Flutter 找不到正确的提供程序
我对使用颤振还不熟悉,当时我正试图在世界上实现一个新冠病毒19病例跟踪器,我在创建一个自定义小部件来显示病例数量时遇到了这个错误,有人能帮我找到解决方案吗?我已经试着解决了几个小时了。 这是widgets库捕获的异常: 错误:在此NewCasesCard小部件上方找不到正确的提供程序 若要修复,请执行以下操作:Flutter 找不到正确的提供程序,flutter,exception,dart,provider,flutter-provider,Flutter,Exception,Dart,Provider,Flutter Provider,我对使用颤振还不熟悉,当时我正试图在世界上实现一个新冠病毒19病例跟踪器,我在创建一个自定义小部件来显示病例数量时遇到了这个错误,有人能帮我找到解决方案吗?我已经试着解决了几个小时了。 这是widgets库捕获的异常: 错误:在此NewCasesCard小部件上方找不到正确的提供程序 若要修复,请执行以下操作: 确保提供程序是此NewCasesCard小部件的祖先 向提供程序提供类型 向消费者提供类型 为Provider.of()提供类型 确保使用了正确的上下文 如果这些解决方案都不起作用,
- 确保提供程序是此NewCasesCard小部件的祖先
- 向提供程序提供类型
- 向消费者提供类型
- 为Provider.of()提供类型
- 确保使用了正确的
上下文
import 'package:stay_safe/Providers/AppBrain.dart';
import 'package:stay_safe/utils/theme.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class NewCasesCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
return getCard(context);
}
Widget getCard(context){
if (Provider.of<AppBrain>(context).isloading2)
return Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: SpinKitPumpingHeart(color: AppTheme().kcolors[0],),
),
);
else {
final countryInfo = Provider.of<AppBrain>(context).countryStats['countrydata'][0];
return Padding(
padding: const EdgeInsets.all(8.0),
child: Card(
elevation: 0.5,
color: Colors.white70,
child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('New Cases Today',style: GoogleFonts.cabin(fontSize: 25),),
),
SizedBox(height: 8,),
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
StatIcon(countryInfo['total_active_cases'], 'Active', AppTheme().kcolors[0]),
StatIcon(countryInfo['total_new_cases_today'], 'New Cases', AppTheme().kcolors[2]),
StatIcon(countryInfo['total_new_deaths_today'], 'Deaths', AppTheme().kcolors[1])
],),
)
],
),
),
);
}
}
}
Widget StatIcon(int count,String type,Color color){
return Column(
children: <Widget>[
Text(count.toString(),style: GoogleFonts.cabin(color: color,fontWeight: FontWeight.bold,fontSize: 20),),
Text(type,style: GoogleFonts.cabin(color: color,fontWeight: FontWeight.bold,fontSize: 20),),
],
);
}
import'package:stay_safe/Providers/AppBrain.dart';
导入“package:stay_safe/utils/theme.dart”;
进口“包装:颤振/材料.省道”;
进口“包装:颤振旋转套件/颤振旋转套件.dart”;
导入“package:google_fonts/google_fonts.dart”;
导入“包:provider/provider.dart”;
类NewCasesCard扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回getCard(上下文);
}
小部件获取卡(上下文){
if(Provider.of(context.isloading2)
返回填充(
填充:常数边集全部(8.0),
儿童:中心(
子项:SpinKitPumpingHeart(颜色:AppTheme().kColor[0],),
),
);
否则{
final countryInfo=Provider.of(context).countryStats['countrydata'][0];
返回填充(
填充:常数边集全部(8.0),
孩子:卡片(
标高:0.5,
颜色:颜色。白色70,
子:列(
儿童:[
填充物(
填充:常数边集全部(8.0),
孩子:文本(“今天的新案例”,样式:GoogleFonts.cabin(fontSize:25),),
),
尺寸箱(高度:8,),
填充物(
填充:常数边集全部(16.0),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
StatIcon(countryInfo['total_active_cases'],'active',AppTheme().kColor[0]),
StatIcon(countryInfo['total_new_cases_today'],'new cases',AppTheme().kColor[2]),
StatIcon(countryInfo['total_new_Deatures_today','Deatures',AppTheme().kColor[1])
],),
)
],
),
),
);
}
}
}
控件StatIcon(int计数、字符串类型、颜色){
返回列(
儿童:[
文本(count.toString(),样式:GoogleFonts.cab(颜色:color,fontWeight:fontWeight.bold,fontSize:20),
文本(类型、样式:GoogleFonts.cabin(颜色:color,字体重量:fontWeight.bold,字体大小:20)),
],
);
}
问题似乎是您在小部件树的不同部分创建了AppBrain
提供程序,以NewCasesCard
,因此当NewCasesCard
试图通过搜索树来查找提供程序时,它无法找到。您需要确保AppBrain
提供程序位于小部件树中NewCasesCard
的上方。例如,在包含此小部件的屏幕中,您可以:
类NewCasesScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
退货供应商)
<代码>无效主{
runApp(多供应商)(
供应商:[
提供程序(创建:(\u)=>AppBrain()),
提供程序(创建:()=>SomethingElse()),
],
儿童:MaterialApp(…),
));
}
通过这种方式,您可以确保始终可以找到提供程序。问题似乎是您在小部件树的不同部分创建了
AppBrain
提供程序,以NewCasesCard
,因此当NewCasesCard
试图通过搜索树来查找提供程序时,它无法找到。您需要确保NewCasesCard
。例如,在包含此小部件的屏幕中,您可以:
类NewCasesScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
退货供应商)
void main{
runApp(多供应商)(
供应商:[
提供程序(创建:(\u)=>AppBrain()),
提供程序(创建:()=>SomethingElse()),
],
儿童:MaterialApp(…),
));
}
通过这种方式,您可以确保始终可以找到提供商。您是从您初始化的位置导航的吗?对不起,我不理解您的问题,我的意思是您是从一个屏幕导航到另一个屏幕,那么您是否面临此问题?不,我刚刚收到(红色错误屏幕)当我进入包含此Widget的屏幕时,您可以添加屏幕截图吗?您是从您初始化的位置导航的吗?抱歉,我不理解您的问题我的意思是您是从一个屏幕导航到另一个屏幕,那么您是否面临此问题?不,我刚刚收到(红色错误屏幕)当我进入包含此Widget的屏幕时,您可以添加屏幕快照吗?