[英]Dart - using provider package correctly
我尝试使用提供程序 package 从不同的 class 触发一个简单的操作。 我做了什么:
1)我创建了一个名为 MySchedule 的 ChangeNotifier class ,它有一个 getter 和一个 setter:
class MySchedule extends ChangeNotifier {
bool _foodSet = false;
bool get foodSet => _foodSet;
set foodSet(bool newBool) {
_foodSet = newBool;
notifyListeners();
}
}
这个小部件的小部件树如下(我使它比原来的更短) - 这是一个有状态的小部件 class
@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 有一个可见性的容器,它是“可见的” boolean 我想与提供者一起更改:
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()”class 内部更改它:在上述 class 内部有以下调用(但它会引发错误):
GestureDetector(
onTap: (){
final schedule2 =
Provider.of<MySchedule>(context);
schedule2.foodSet = true;
}
错误是:错误:在此 FoodList 小部件上方找不到正确的提供者
要修复,请:
您的调用引用了MySchedule类型的提供者:
Provider.of<MySchedule>(context)
如文档中所述:
此方法将从与传递的 BuildContext 关联的小部件开始在小部件树中查找,它将返回找到的最近的 T 类型变量(如果没有找到,则抛出)。
它将在小部件树中查找,寻找具有最接近类型的提供程序。 由于它找不到,它会抛出一个错误,准确地告诉你:
在此 FoodList 小部件上方找不到正确的提供者
尝试替换您的 ChangeNotifierProvider 声明以包含它应该提供的 class :
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<MySchedule>(
builder: (context) => MySchedule(),
child:
[...]
尝试更改 MySchedule 的声明
class MySchedule with ChangeNotifier { ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.