android - 错误:找不到正确的提供者在此 EquipmentItemWidget$ Widget 上方
问题描述
我是 Flutter 的新手(我是一名 android 开发人员),但我遇到了一个我没有解决方案的问题。## 我要做什么## 我想创建一个水平列表视图,其中有状态小部件作为项目。可以选择或取消选择这些项目。它们是页面的一部分。
[选择列表视图项目][1]
[未选择列表视图项目][2]
错误
错误:在此 EquipmentItemWidget$ 小部件上方找不到正确的提供程序
发生这种情况是因为您使用了BuildContext
不包括您选择的提供者的 。有几种常见的场景:
您在您的中添加了一个新的提供程序
main.dart
并执行了热重载。要修复,请执行热重启。您尝试读取的提供程序位于不同的路径中。
提供者是“范围的”。因此,如果您在路由中插入提供程序,那么其他路由将无法访问该提供程序。
您使用的
BuildContext
是您尝试读取的提供程序的祖先。确保 EquipmentItemWidget$ 在您的 MultiProvider/Provider 下。这通常发生在您创建提供程序并尝试立即读取它时。
例如,而不是:
Widget build(BuildContext context) { return Provider<Example>( create: (_) => Example(), // Will throw a ProviderNotFoundError, because `context` is associated // to the widget that is the parent of `Provider<Example>` child: Text(context.watch<Example>()), ), }
考虑
builder
像这样使用:Widget build(BuildContext context) { return Provider<Example>( create: (_) => Example(), // we use `builder` to obtain a new `BuildContext` that has access to the provider builder: (context) { // No longer throws return Text(context.watch<Example>()), } ), }
我的代码
SearchGamePage.dart
class SearchGamePage extends StatefulWidget {
@override
_SearchGamePageState createState() => _SearchGamePageState();
}
class _SearchGamePageState extends State<SearchGamePage> {
...
@override
Widget build(BuildContext context) {
...
return Scaffold(
body: Container(
margin: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
children: [
buttonSearch,
inputBarSearch,
sliderNumberPerson,
listEquipment,
sliderHardness
],
),
),
));
}
}
EquipChangeNotifier.dart
class EquipChangeNotifier with ChangeNotifier {
bool isEquip;
EquipChangeNotifier(this.isEquip);
//GETTER
bool get isEquipGet => isEquip;
//SETTER
set isEquipSet(bool isEquip){
this.isEquip = isEquip;
notifyListeners();
}
}
EquipmentItemWidget.dart
class EquipmentItemWidget extends StatefulWidget {
final String type;
EquipmentItemWidget({Key key, this.type}) : super(key: key);
@override
_EquipmentItemWidgetState createState() => _EquipmentItemWidgetState(type);
}
class _EquipmentItemWidgetState extends State<EquipmentItemWidget> {
bool isSelected = false;
final type;
final List<String> urlIconEquipment = ['images/equipment/balle_ping_pong.PNG', 'images/equipment/carte.PNG', 'images/equipment/des.PNG', 'images/equipment/goblet.PNG', 'images/equipment/table.PNG'];
_EquipmentItemWidgetState(this.type);
String getPath(String type){
switch(type){
case 'balle':
return urlIconEquipment[0];
case 'carte':
return urlIconEquipment[1];
case 'des':
return urlIconEquipment[2];
case 'goblet':
return urlIconEquipment[3];
case 'table':
return urlIconEquipment[4];
}
}
void _toggleEquipmentSearch(EquipChangeNotifier notifier){
setState(() {
isSelected = !isSelected;
notifier.isEquipSet = isSelected;
});
}
@override
Widget build(BuildContext context) {
EquipChangeNotifier notifier = Provider.of<EquipChangeNotifier>(context);
isSelected = notifier.isEquipGet;
return GestureDetector(
onTap: (){
_toggleEquipmentSearch(notifier);
},
child: Container(
padding: EdgeInsets.all(16),
child: Column(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(300),
child: Container(
padding: EdgeInsets.all(5),
color: Colors.white24,
child: (Image.asset(
(!isSelected?getPath(type):'images/equipment/valid.PNG'),
width: 50,
height: 50,
fit: BoxFit.scaleDown,
)),
)),
Container(
margin: EdgeInsets.only(top: 8),
child: Text(type, style: Theme.of(context).textTheme.headline6,))
],
),
),
);
}
}
预先感谢您的帮助 !!
解决方案
推荐阅读
- python - 识别 PDF 文件中的表格和图像
- java - 无法使用 Apache POI 在 Excel 中删除分组
- java - 在 Heroku 上部署 Spring Boot + Reacts JS 应用程序时出错 - 应用程序崩溃
- python - 如何在熊猫中进行聚合?
- html - 将内联样式移动到外部 CSS
- c# - 如何从用户控件访问其子窗体?
- python - 终端应用程序在第一次输入后退出程序。需要帮助测试 Python '猜数字游戏'
- java - K-means 聚类算法中的收敛条件是什么?
- physics - 薛定谔与散射最大
- java - 无法读取 Firebase 数据库,数据返回 null