在下面的测试代码中,我有一个标志,用于确定是使用 ChangeNotifierProvider 还是 ChangeNotifierProxyProvider。当我按下这RaisedButton
两种方法时,正确显示我的 GroupEditorPage。
const isUsingChangeNotifierProxyProvider = true;
class GroupsPage extends StatelessWidget {
showGroupEditor(BuildContext context) {
Navigator.push(
context,
MaterialPageRoute(builder: (_) {
return isUsingChangeNotifierProxyProvider
? ChangeNotifierProxyProvider<CloudServicesProvider,
GroupEditorProvider>(
create: (_) => GroupEditorProvider(),
update: (_, cloudServicesProvider, groupEditorProvider) =>
groupEditorProvider.update(cloudServicesProvider),
child: GroupEditorPage(),
)
: ChangeNotifierProvider<GroupEditorProvider>(
create: (_) => GroupEditorProvider(),
child: GroupEditorPage(),
);
}),
);
}
@override
Widget build(BuildContext context) {
return SliversPage(
text: 'Testing',
sliverList: SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return RaisedButton(
child: Text('+Create Group'),
onPressed: () => showGroupEditor(context),
);
},
childCount: 1,
),
),
);
}
}
但Provider.of
仅在使用 ChangeNotifierProvider 时返回我的 GroupEditorProvider 实例。当使用 Change ChangeNotifierProxyProvider 时,groupEditorProvider
下面是null
.
class GroupEditorPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final groupEditorProvider = Provider.of<GroupEditorProvider>(context);
我使用 Provider 已经有一段时间了,但对 ChangeNotifierProxyProvider 还是陌生的,所以很可能不了解一些基本的东西。