Flutter:当它是 FutureProvider() 时找不到 `Provider.of(context)`
Flutter: `Provider.of(context)` cannot be found when it is a `FutureProvider()`
我的小部件树中有一个提供程序,我调用 Provider.of<List<...>>(context)
来查找它。如果它是任何类型的提供者,它都可以正常工作,但是,一旦将提供者从 Provider()
(例如)更改为 FutureProvider()
,它就不起作用。
我没有更改树中的任何小部件,也没有更改它们在导航器中的位置。 Provider.of()
工作正常但是一旦我将它设置为 FutureProvider()
然后它就不起作用了。
编辑:我的代码看起来像这样:
内部构件构建:
return FutureProvider(
initialData: [],
create: (_) =>
DatabaseService(uid: _auth.getUser()!.uid).getJournalEntries(),
catchError: (context, error) {
print(error.toString());
},
...
}
然后 children 中的一个是另一个小部件,这是它的构建函数:
List<JournalEntryData> entries =
Provider.of<List<JournalEntryData>>(context);
return ElevatedButton(
onPressed: () {
print(entries);
},
child: Text('print provider data'));
}
我收到以下错误:
错误:在此 TestButton 小部件上方找不到正确的 Provider
发生这种情况是因为您使用的 BuildContext
不包括提供商
你的选择。有几个常见的场景:
您在 main.dart
中添加了一个新提供商并执行了 hot-reload。
要修复,请执行 hot-restart.
您尝试读取的提供者在不同的路径上。
提供商是“范围内的”。因此,如果您在路由中插入提供者,则
其他路由将无法访问该提供商。
您使用的 BuildContext
是您尝试读取的提供商的祖先。
确保 TestButton 在您的 MultiProvider/Provider 下。
这通常发生在您创建提供程序并尝试立即读取它时。
例如,而不是:
Widget build(BuildContext context) {
return Provider<Example>(
create: (_) => Example(),
// Will throw a ProviderNotFoundError, because `context` is associated
// to the widget that is the parent of `Provider<Example>`
child: Text(context.watch<Example>()),
),
}
考虑像这样使用 builder
:
Widget build(BuildContext context) {
return Provider<Example>(
create: (_) => Example(),
// we use `builder` to obtain a new `BuildContext` that has access to the provider
builder: (context) {
// No longer throws
return Text(context.watch<Example>()),
}
),
}
问题是小部件树中有一个提供者:
将 FutureProvider()
替换为任何其他类型的提供程序即可使其正常工作,但我需要一个 FutureProvider()
。
我没有定义 FutureProvider()
的类型,所以它是 dynamic
但在我的 Provider.of()
调用中我指定了导致问题的类型。指定 FutureProvider()
的类型应该可以解决问题。
我的小部件树中有一个提供程序,我调用 Provider.of<List<...>>(context)
来查找它。如果它是任何类型的提供者,它都可以正常工作,但是,一旦将提供者从 Provider()
(例如)更改为 FutureProvider()
,它就不起作用。
我没有更改树中的任何小部件,也没有更改它们在导航器中的位置。 Provider.of()
工作正常但是一旦我将它设置为 FutureProvider()
然后它就不起作用了。
编辑:我的代码看起来像这样:
内部构件构建:
return FutureProvider(
initialData: [],
create: (_) =>
DatabaseService(uid: _auth.getUser()!.uid).getJournalEntries(),
catchError: (context, error) {
print(error.toString());
},
...
}
然后 children 中的一个是另一个小部件,这是它的构建函数:
List<JournalEntryData> entries =
Provider.of<List<JournalEntryData>>(context);
return ElevatedButton(
onPressed: () {
print(entries);
},
child: Text('print provider data'));
}
我收到以下错误:
错误:在此 TestButton 小部件上方找不到正确的 Provider
发生这种情况是因为您使用的 BuildContext
不包括提供商
你的选择。有几个常见的场景:
您在
main.dart
中添加了一个新提供商并执行了 hot-reload。 要修复,请执行 hot-restart.您尝试读取的提供者在不同的路径上。
提供商是“范围内的”。因此,如果您在路由中插入提供者,则 其他路由将无法访问该提供商。
您使用的
BuildContext
是您尝试读取的提供商的祖先。确保 TestButton 在您的 MultiProvider/Provider
- 下。
这通常发生在您创建提供程序并尝试立即读取它时。
例如,而不是:
Widget build(BuildContext context) { return Provider<Example>( create: (_) => Example(), // Will throw a ProviderNotFoundError, because `context` is associated // to the widget that is the parent of `Provider<Example>` child: Text(context.watch<Example>()), ), }
考虑像这样使用
builder
:Widget build(BuildContext context) { return Provider<Example>( create: (_) => Example(), // we use `builder` to obtain a new `BuildContext` that has access to the provider builder: (context) { // No longer throws return Text(context.watch<Example>()), } ), }
问题是小部件树中有一个提供者:
将 FutureProvider()
替换为任何其他类型的提供程序即可使其正常工作,但我需要一个 FutureProvider()
。
我没有定义 FutureProvider()
的类型,所以它是 dynamic
但在我的 Provider.of()
调用中我指定了导致问题的类型。指定 FutureProvider()
的类型应该可以解决问题。