Flutter flatter:`Provider.of(context)`在它是`FutureProvider()时找不到`
我的小部件树中有一个提供者,我调用Flutter flatter:`Provider.of(context)`在它是`FutureProvider()时找不到`,flutter,dart,flutter-provider,Flutter,Dart,Flutter Provider,我的小部件树中有一个提供者,我调用provider.of(context)来查找它。如果它是任何类型的提供程序,它都可以正常工作,但是,只要将提供程序从provider()(例如)更改为FutureProvider(),它就无法工作 我没有更改树中的任何小部件,也没有更改它们在导航器中的位置Provider.of()工作正常,但一旦我将其设置为FutureProvider()它就不工作了 编辑:我的代码如下所示: 内部小部件构建: returnfutureprovider( 初始数据:[], 创
provider.of(context)
来查找它。如果它是任何类型的提供程序,它都可以正常工作,但是,只要将提供程序从provider()
(例如)更改为FutureProvider()
,它就无法工作
我没有更改树中的任何小部件,也没有更改它们在导航器中的位置Provider.of()
工作正常,但一旦我将其设置为FutureProvider()
它就不工作了
编辑:我的代码如下所示:
内部小部件构建:
returnfutureprovider(
初始数据:[],
创建:())=>
数据库服务(uid:_auth.getUser()!.uid).getJournalEntries(),
catchError:(上下文,错误){
打印(error.toString());
},
...
}
然后其中一个子部件是另一个小部件,这是它的构建功能:
列出条目=
(上下文)的提供者;
返回升降按钮(
已按下:(){
打印(条目);
},
子项:文本(“打印提供程序数据”);
}
我得到以下错误:
错误:在此TestButton小部件上方找不到正确的提供程序
这是因为您使用了不包含提供程序的BuildContext
由您选择。有几种常见情况:
- 您在
中添加了一个新的提供程序,并执行了热重新加载。 要修复此问题,请执行热重启main.dart
- 您试图读取的提供程序位于不同的路径中 提供者是“范围化”的。因此,如果在路由中插入提供者,则 其他路由将无法访问该提供商
- 您使用了一个
,它是您试图读取的提供程序的祖先 确保TestButton位于MultiProvider/Provider下。 这通常发生在创建提供者并尝试立即读取它时 例如,而不是:BuildContext
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>()), ), }
将
FutureProvider()
替换为任何其他类型的提供程序都可以使其工作,但我需要一个FutureProvider()
我没有定义FutureProvider()
的类型,所以它是动态的
,但是在我的提供程序中
call我指定了导致问题的类型。指定FutureProvider()
的类型应该可以解决问题。什么意思它不起作用?当我调用Provider.of()时,是否出现错误
它是一个未来的提供商。它会抛出一个红色屏幕的错误,表示小部件树中没有提供商,基本上它找不到,但如果我将其更改为任何其他类型的提供商,我不会收到错误,并且一切正常。我现在不在计算机旁,但我会在更新帖子时提供更多信息可以。可能添加listen:false
到你的Provider.of
?@SilkeNL,但这不起作用。我更新了帖子以包含错误。可能是你以后需要包装你的列表吗?Provider.of(context);
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>()),
}
),
}