我是新手,正在测试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();
}
}
我只是看不出有什么区别或为何如此重要。该代码不应该等效吗?任何见识将不胜感激。
答案 0 :(得分:1)
区别在于,在CustomText
情况下,context
来自其父窗口小部件MyApp
,而在第二种情况下,context
来自{{1 }}的父母。由于您的提供者是在MyApp
内部实现的,因此如果您使用MyApp
的父母的MyApp
(第二种情况),它将找不到提供者