Flutter:从其他提供者访问提供者
Flutter: accessing providers from other providers
对于我的 flutter 项目,我使用了以下多个提供程序:
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<FirstProvider>(
create: (context) => FirstProvider(),
),
ChangeNotifierProvider<SecondProvider>(
create: (context) => SecondProvider(),
),
ChangeNotifierProvider<ThirdProvider>(
create: (context) => ThirdProvider(),
),
ChangeNotifierProvider<FourthProvider>(
create: (context) => FourthProvider(),
),
],
child: const MainApp(),
);
}
因为有时我需要从另一个提供者那里获取数据或调用来自不同提供者的函数,所以我这样使用它:
//First Provider
class FirstProvider with ChangeNotifier {
void callFunctionFromSecondProvider({
required BuildContext context,
}) {
//Access the SecondProvider
final secondProvider= Provider.of<SecondProvider>(
context,
listen: false,
);
secondProvider.myFunction();
}
}
//Second Provider
class SecondProvider with ChangeNotifier {
bool _currentValue = true;
void myFunction(){
//Do something
}
}
FirstProvider
的 callFunctionFromSecondProvider()
是从小部件调用的,它将成功调用 myFunction()
,大多数时候。
根据功能的复杂性,我有时会遇到无法访问 SecondProvider
,大概是因为 context
为 null
,当小部件状态发生变化时.
我正在阅读一些关于 provider
的在线文档,他们建议 changenotifierproxyprovider
我理解为 1 to 1
供应商关系。
但是,在我的例子中,一个提供者需要被多个提供者访问,反之亦然。
问题:
是否有更合适的方法来处理我的案例,即一个提供者可以被多个提供者访问?
编辑:
访问提供者也应该能够在不创建新实例的情况下访问不同的变量值。
不是将 context
传递给 callFunctionFromSecondProvider
函数,而是添加第二个提供程序作为参数。所以函数如下所示。
不确定这是正确的做法,但我的上下文空问题已通过这种方式解决。
void callFunctionFromSecondProvider({
required SecondProvider secondProvider,
}) {
secondProvider.myFunction();
}
}
好的。
所以看起来同一作者的 Riverpod 是可行的方法,因为它解决了很多缺陷,例如 Provider 依赖于 widget 树,在我的例子中,潜在的问题是从哪里来的。
——————
目前,我仍然需要使用提供者,为了快速而肮脏的解决方案,我不仅提供了我尝试访问提供者的当前小部件的上下文,还提供了传递父级的上下文直接在小部件的上下文中,以便在关闭模式(例如)的情况下,仍然可以使用父上下文执行任何后续提供程序调用。
希望这对您有所帮助。
对于我的 flutter 项目,我使用了以下多个提供程序:
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<FirstProvider>(
create: (context) => FirstProvider(),
),
ChangeNotifierProvider<SecondProvider>(
create: (context) => SecondProvider(),
),
ChangeNotifierProvider<ThirdProvider>(
create: (context) => ThirdProvider(),
),
ChangeNotifierProvider<FourthProvider>(
create: (context) => FourthProvider(),
),
],
child: const MainApp(),
);
}
因为有时我需要从另一个提供者那里获取数据或调用来自不同提供者的函数,所以我这样使用它:
//First Provider
class FirstProvider with ChangeNotifier {
void callFunctionFromSecondProvider({
required BuildContext context,
}) {
//Access the SecondProvider
final secondProvider= Provider.of<SecondProvider>(
context,
listen: false,
);
secondProvider.myFunction();
}
}
//Second Provider
class SecondProvider with ChangeNotifier {
bool _currentValue = true;
void myFunction(){
//Do something
}
}
FirstProvider
的 callFunctionFromSecondProvider()
是从小部件调用的,它将成功调用 myFunction()
,大多数时候。
根据功能的复杂性,我有时会遇到无法访问 SecondProvider
,大概是因为 context
为 null
,当小部件状态发生变化时.
我正在阅读一些关于 provider
的在线文档,他们建议 changenotifierproxyprovider
我理解为 1 to 1
供应商关系。
但是,在我的例子中,一个提供者需要被多个提供者访问,反之亦然。
问题:
是否有更合适的方法来处理我的案例,即一个提供者可以被多个提供者访问?
编辑:
访问提供者也应该能够在不创建新实例的情况下访问不同的变量值。
不是将 context
传递给 callFunctionFromSecondProvider
函数,而是添加第二个提供程序作为参数。所以函数如下所示。
不确定这是正确的做法,但我的上下文空问题已通过这种方式解决。
void callFunctionFromSecondProvider({
required SecondProvider secondProvider,
}) {
secondProvider.myFunction();
}
}
好的。
所以看起来同一作者的 Riverpod 是可行的方法,因为它解决了很多缺陷,例如 Provider 依赖于 widget 树,在我的例子中,潜在的问题是从哪里来的。
——————
目前,我仍然需要使用提供者,为了快速而肮脏的解决方案,我不仅提供了我尝试访问提供者的当前小部件的上下文,还提供了传递父级的上下文直接在小部件的上下文中,以便在关闭模式(例如)的情况下,仍然可以使用父上下文执行任何后续提供程序调用。
希望这对您有所帮助。