找不到正确的提供者

时间:2020-05-12 05:12:37

标签: flutter exception dart provider flutter-provider

我是不熟悉flutter的人,在世界上尝试实现covid 19案例跟踪器,并且在创建用于显示案例数的自定义小部件时遇到了此错误,有人可以帮助我找出解决方案正是因为我已经尝试修复了几个小时。 这是窗口小部件库捕获的异常: 错误:在此NewCasesCard小部件上方找不到正确的提供程序

要解决,请:

  • 确保提供者是此NewCasesCard小部件的祖先
  • 向提供者提供类型
  • 为消费者提供类型
  • 将类型提供给Provider.of()
  • 确保使用正确的context

如果这些解决方案均无效,请在以下位置提交错误: https://github.com/rrousselGit/provider/issues

代码如下:

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),),
    ],
  );
}

1 个答案:

答案 0 :(得分:0)

问题似乎是您在小部件树中与AppBrain不同的位置创建了NewCasesCard提供程序,因此,当NewCasesCard尝试通过搜索树来查找提供程序时,它将无法。您需要确保AppBrain提供程序在小部件树中某个位置的NewCasesCard上方。因此,例如在包含此小部件的屏幕中,您可以:


class NewCasesScreen extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Provider<AppBrain>(
      create: (_) => AppBrain(),
        child: Scaffold(
          body: ListView(
            children: [
              NewCasesCard(),
              ...
            ]
        ),
      ),
    ); 
  }

或者,您可以在应用程序顶部初始化提供程序,因为从名称上看,它似乎在整个使用过程中一样。为此,您可以利用MultiProvider并具有: (示例取自package readme

void main {
  runApp(MultiProvider(
    providers: [
      Provider<AppBrain>(create: (_) => AppBrain()),
      Provider<SomethingElse>(create: (_) => SomethingElse()),
    ],
    child: MaterialApp(...),
   ));
}

这样,您可以确定将始终找到该提供程序。