【问题标题】:Dart - using provider package correctlyDart - 正确使用提供程序包
【发布时间】:2019-10-23 14:45:04
【问题描述】:

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

1) 我创建了一个名为 MySchedule 的 ChangeNotifier 类,它有一个 getter 和一个 setter:

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

要修复,请:

  • 确保 Provider 是此 FoodList 小部件的祖先

【问题讨论】:

    标签: flutter dart provider


    【解决方案1】:

    您的调用引用了 MySchedule 类型的提供者:

    Provider.of&lt;MySchedule&gt;(context)

    the documentation中所述:

    此方法将从与传递的 BuildContext 关联的小部件开始在小部件树中查找,它将返回找到的最近的 T 类型变量(如果没有找到,则抛出)。

    它将在小部件树中向上查找,寻找具有最接近类型的提供程序。由于它找不到,它会抛出一个错误,准确地告诉你:

    在此 FoodList 小部件上方找不到 正确 Provider

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

    @override
      Widget build(BuildContext context) {
    
        return  ChangeNotifierProvider<MySchedule>(
            builder: (context) => MySchedule(),
        child:
        [...]
    

    【讨论】:

      【解决方案2】:

      尝试更改 MySchedule 的声明

      class MySchedule with ChangeNotifier { ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2016-12-06
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        相关资源
        最近更新 更多