Flutter 找不到正确的提供程序

Flutter 找不到正确的提供程序,flutter,exception,dart,provider,flutter-provider,Flutter,Exception,Dart,Provider,Flutter Provider,我对使用颤振还不熟悉,当时我正试图在世界上实现一个新冠病毒19病例跟踪器,我在创建一个自定义小部件来显示病例数量时遇到了这个错误,有人能帮我找到解决方案吗?我已经试着解决了几个小时了。 这是widgets库捕获的异常: 错误:在此NewCasesCard小部件上方找不到正确的提供程序 若要修复,请执行以下操作: 确保提供程序是此NewCasesCard小部件的祖先 向提供程序提供类型 向消费者提供类型 为Provider.of()提供类型 确保使用了正确的上下文 如果这些解决方案都不起作用,

我对使用颤振还不熟悉,当时我正试图在世界上实现一个新冠病毒19病例跟踪器,我在创建一个自定义小部件来显示病例数量时遇到了这个错误,有人能帮我找到解决方案吗?我已经试着解决了几个小时了。 这是widgets库捕获的异常: 错误:在此NewCasesCard小部件上方找不到正确的提供程序

若要修复,请执行以下操作:

  • 确保提供程序是此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
试图通过搜索树来查找提供程序时,它无法找到。您需要确保e> AppBrain
provider位于小部件树中的某个位置上方的
NewCasesCard
。例如,在包含此小部件的屏幕中,您可以:


类NewCasesScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
退货供应商)

void main{
runApp(多供应商)(
供应商:[
提供程序(创建:(\u)=>AppBrain()),
提供程序(创建:()=>SomethingElse()),
],
儿童:MaterialApp(…),
));
}

通过这种方式,您可以确保始终可以找到提供商。

您是从您初始化的位置导航的吗?对不起,我不理解您的问题,我的意思是您是从一个屏幕导航到另一个屏幕,那么您是否面临此问题?不,我刚刚收到(红色错误屏幕)当我进入包含此Widget的屏幕时,您可以添加屏幕截图吗?您是从您初始化的位置导航的吗?抱歉,我不理解您的问题我的意思是您是从一个屏幕导航到另一个屏幕,那么您是否面临此问题?不,我刚刚收到(红色错误屏幕)当我进入包含此Widget的屏幕时,您可以添加屏幕快照吗?