【发布时间】:2021-05-31 17:02:23
【问题描述】:
我的小部件树中有一个提供程序,我调用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());
},
...
}
然后其中一个孩子是另一个小部件,这是它的构建功能:
List<JournalEntryData> entries =
Provider.of<List<JournalEntryData>>(context);
return ElevatedButton(
onPressed: () {
print(entries);
},
child: Text('print provider data'));
}
我收到以下错误:
错误:在此 TestButton 小部件上方找不到正确的 Provider
发生这种情况是因为您使用了不包含提供程序的 BuildContext
你的选择。有几种常见的情况:
-
您在
main.dart中添加了一个新提供程序并执行了热重载。 要修复,请执行热重启。 -
您尝试读取的提供程序位于不同的路径中。
提供者是“范围的”。因此,如果您在路线内插入提供者,那么 其他路由将无法访问该提供程序。
-
您使用了
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()。
【问题讨论】:
-
你的意思是它不起作用?你有错误吗?
-
当我调用
Provider.of()并且它是一个未来的提供者时,它会抛出一个错误并显示红色屏幕,说小部件树中没有提供者,基本上它找不到它但是如果我改变它给任何其他类型的提供商我没有收到错误,一切正常。我现在不在电脑旁,但我会尽可能更新帖子,提供更多信息。 -
可以将
listen: false添加到您的Provider.of吗? github.com/rrousselGit/provider/issues/313 -
@SilkeNL 那没用。我更新了帖子以包含错误。
-
您是否需要将您的列表包装在 Future 中?
Provider.of<Future<List<JournalEntryData>>>(context);
标签: flutter dart flutter-provider