找不到正确的提供者

Posted

技术标签:

【中文标题】找不到正确的提供者【英文标题】:Could not find the correct Provider 【发布时间】:2020-08-27 20:29:30 【问题描述】:

我是使用颤振的新手,我试图在世界上实现一个 covid 19 病例跟踪器,在创建自定义小部件以显示病例数时出现此错误,谁能帮我找出解决方案这正是我已经尝试修复它几个小时了。 这是小部件库捕获的异常: 错误:在此 NewCasesCard 小部件上方找不到正确的提供程序

要修复,请:

确保 Provider 是此 NewCasesCard 小部件的祖先 向 Provider 提供类型 向消费者提供类型 向 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】:

问题看起来像您在小部件树的不同部分中创建了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(...),
   ));

这样您就可以确保总能找到提供者。

【讨论】:

以上是关于找不到正确的提供者的主要内容,如果未能解决你的问题,请参考以下文章

找不到正确的提供者不一致的行为

找不到正确的提供者<>

Flutter cubit blocprovider 找不到正确的提供者

找不到提供者。它可能没有正确安装:ADODB [重复]

在此小部件上方找不到正确的提供程序

在对话框中使用 BLoC:找不到正确的提供程序