当实例化从 MyHomePage() 路由的 NotificationsPage 时会发生这种情况
这是我的代码:
void main() =>runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
final db = AppDatabase();
return MultiProvider(
providers: [
// ignore: unnecessary_statements, missing_return
Provider<MeetingDao>( create: (BuildContext context) {builder: (_) => db.Table1Dao;}, ),
// ignore: unnecessary_statements, missing_return
Provider<UserDao>( create: (BuildContext context) {builder: (_) => db.Table2Dao;}, ),
],
child: MaterialApp(
title: 'MyApp',
home: MyHomePage(),
),
);
}
}
这是错误日志:
错误:在此 NotificationsPage 小部件上方找不到正确的提供程序
这可能是因为您使用了BuildContext
不包括您选择的提供者的 a。有几种常见的场景:
您尝试读取的提供程序位于不同的路径中。
提供者是“范围的”。因此,如果您在路由中插入提供程序,那么其他路由将无法访问该提供程序。
您使用的
BuildContext
是您尝试读取的提供程序的祖先。确保 NotificationsPage 在您的 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>()), } ), }
关于这个主页有什么问题的任何建议?在通知页面中,我正在访问它
final tbl1Dao = Provider.of<Table1Dao>(context,listen: false);