flutter - 找不到正确的提供者
问题描述
我是使用颤振的新手,我试图在世界上实现一个 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),),
],
);
}
解决方案
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
并拥有:(示例取自包自述文件)
void main {
runApp(MultiProvider(
providers: [
Provider<AppBrain>(create: (_) => AppBrain()),
Provider<SomethingElse>(create: (_) => SomethingElse()),
],
child: MaterialApp(...),
));
}
通过这种方式,您可以确保始终可以找到提供者。
推荐阅读
- javascript - 在 requestAnimationFrame() 中重置“时间戳”的值?
- sql - 根据rowversion值更新记录?
- sql - Oracle 10g:解析 2 列合并重复项
- python - 尝试实现 mongoDB IO 连接器接收器时出错
- android - 强制只使用纵向xml布局android?
- javascript - React - 无法从子道具中触发功能
- php - 使用正则表达式删除空参数
- php - Laravel 5.7 - 使用命令 'php artisan make:auth' 后 Ckeditor 停止显示
- php - 如何从 php 中的句子中仅获取特定字符串以将其上传到数据库
- java - 如何防止 Java 超出容器内存限制?