Flutter Provider:为什么像tihis那样调用Provider.of <Widget>(context)时会发生此错误:

时间:2019-10-23 09:16:38

标签: flutter dart

我是新手,正在测试Provider,无法弄清楚为什么这样做(按工作原理,我的意思是它在应用栏中显示了一个列表):

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Data>(
      builder: (context)=> Data(),
        child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: CustomText(),
          ),
        ),
      ),
    );
  }
}

使用几乎不执行任何操作的CustomText类:

class CustomText extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Text(Provider.of<Data>(context).texts.tostring());
  }
}

但这另一件事引发了一个错误-在此MyApp小部件上方找不到正确的提供程序-错误:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Data>(
      builder: (context)=> Data(),
        child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text(Provider.of<Data>(context).texts.toString()),
          ),
        ),
      ),
    );
  }
}

数据类为:

class Data with ChangeNotifier{
  List<String> _texts = ['Text 1', 'Text 2', 'Text 3', 'Text 4',];

  get texts {
    return _texts;
  }

  void deleteText(int index){
    this._texts.removeAt(index);
    notifyListeners();
  }

  void addText(String text){
    this._texts.add(text);
  notifyListeners();
  }
}

我只是看不出有什么区别或为何如此重要。该代码不应该等效吗?任何见识将不胜感激。

1 个答案:

答案 0 :(得分:1)

区别在于,在CustomText情况下,context来自其父窗口小部件MyApp,而在第二种情况下,context来自{{1 }}的父母。由于您的提供者是在MyApp内部实现的,因此如果您使用MyApp的父母的MyApp(第二种情况),它将找不到提供者