繁体   English   中英

Dart - 正确使用提供者 package

[英]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 小部件上方找不到正确的提供者

要修复,请:

  • 确保 Provider 是此 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM