我尝试使用提供程序包从另一个类触发一个简单的动作。我做了什么:
1)我创建了一个名为MySchedule的ChangeNotifier类,该类具有一个吸气剂和一个吸气剂:
class MySchedule extends ChangeNotifier {
bool _foodSet = false;
bool get foodSet => _foodSet;
set foodSet(bool newBool) {
_foodSet = newBool;
notifyListeners();
}
}
此小部件的小部件树如下(我使它比原来的短)-这是在有状态小部件类中
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (context) => MySchedule(),
child: Scaffold(
body: Stack(
children: <Widget>[
Container(
child: AnotherWidgetWhichHasLotOfChild()
),
),
AnimatedContainer(
curve: Curves.fastOutSlowIn,
duration: Duration(milliseconds: 500),
alignment: Alignment(left, -1),
child: MenuSheet(close: toggleMainMenu, change: changeToTab),
),
FoodDetailsClass()
],
),
));
}
FoodDetailsClass在可见性中有一个容器,我想与提供者一起更改“可见”布尔值:
class FoodDetailsClass extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<MySchedule>(
builder: (context, provider, child) => Visibility(
visible: provider.foodSet,
child: Center(
child: Container(
height: 600,
width: 400,
color: Colors.red,
),
),
));
}
}
我想以这种方式从“ AnotherWidgetWhichHasLotOfChild()”类内部进行更改: 在上述类中,有一个以下调用(但是会引发错误):
GestureDetector(
onTap: (){
final schedule2 =
Provider.of<MySchedule>(context);
schedule2.foodSet = true;
}
错误是: 错误:在此FoodList小部件上方找不到正确的提供程序
要修复,请:
答案 0 :(得分:0)
您的呼叫引用了 MySchedule 类型的提供商:
domain
如the documentation中所述:
此方法将从与传递的BuildContext关联的窗口小部件开始的窗口小部件树中查找,并将返回找到的最接近的T类型变量(如果找不到则抛出该异常)。
在小部件树中会向上查找,查找类型最接近的提供者。由于找不到,因此会引发错误,准确告诉您:
在此FoodList小部件上方找不到正确提供程序
尝试替换您的ChangeNotifierProvider声明以包含它应提供的类:
example.com
答案 1 :(得分:0)
尝试更改MySchedule的声明
class MySchedule with ChangeNotifier { ...