Dart-正确使用提供程序包

时间:2019-10-23 14:45:04

标签: flutter dart provider

我尝试使用提供程序包从另一个类触发一个简单的动作。我做了什么:

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小部件上方找不到正确的提供程序

要修复,请:

  • 确保提供者是此FoodList小部件的祖先

2 个答案:

答案 0 :(得分:0)

您的呼叫引用了 MySchedule 类型的提供商:

domain

the documentation中所述:

  

此方法将从与传递的BuildContext关联的窗口小部件开始的窗口小部件树中查找,并将返回找到的最接近的T类型变量(如果找不到则抛出该异常)。

在小部件树中会向上查找,查找类型最接近的提供者。由于找不到,因此会引发错误,准确告诉您:

  

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

尝试替换您的ChangeNotifierProvider声明以包含它应提供的类:

example.com

答案 1 :(得分:0)

尝试更改MySchedule的声明

class MySchedule with ChangeNotifier { ...