如何解决如何在 Flutter 中正确扩展自定义 Provider
我有一个父 ChangeNotifier ParentProvider
,另外 2 个提供者扩展了 ParentProvider
;
ChildProviderA
,ChildProviderB
。
我有一条路线,名为 MyScreen
class MyScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
if(ModalRoute.of(context).settings.arguments != null){
return ChangeNotifierProvider(
create: (context) => ChildProviderA(),child: _Screen()
);
}
return ChangeNotifierProvider(
create: (context) => ChildProviderB(),child: _Screen()
);
}
}
根据我想使用提供程序的参数,在任何一种情况下,我都想在 initData()
小部件的 ParentProvider
中调用一个名为 _Screen
的函数。
@override
Widget build(BuildContext context) {
...
Provider.of<ParentProvider>(context,listen: false).initData();
...
}
Error: Could not find the correct Provider<ParentProvider> above this _Screen Widget
如果我使用 Provider.of<ChildProviderA>(context,listen: false).initData();
或 Provider.of<ChildProviderB>(context,listen: false).initData();
它有效,但我希望在使用的任一子 Provider 中都能够调用 initData。
这是怎么做到的?
解决方法
Provider.of
查找具有完全给定类型的提供程序。它不包括子类型。
如果子屏幕需要访问一些具有相同格式的不同数据,您可以在两种情况下使用相同的提供程序通过构造函数向其传递不同的数据:
class MyScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (condition) {
return ChangeNotifierProvider(
create: (context) => ParentProvider(data1),child: _Screen(),);
}
return ChangeNotifierProvider(
create: (context) => ParentProvider(data2),);
}
}
如果你真的有两个不同的 ChangeNotifier 实现共享相同的接口,你可以使用父类型提供和访问它们:
class MyScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (condition) {
return ChangeNotifierProvider<ParentProvider>(
create: (context) => ChildProviderA(),);
}
return ChangeNotifierProvider<ParentProvider>(
create: (context) => ChildProviderB(),);
}
}
,
当你定义你的孩子提供者时,使用扩展。 此外,所有提供者都必须高于孩子并在他们正在收听的同一路线上。您可以在定义子类时尝试添加 extends ParentProvider。即
class ChildA extends ParentProvider {
//here you have access to methods in parent.
you can add a method here that triggers something form the parent.
void childMethod ()=> methodFromParentLikeInitData();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。