1

当实例化从 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);
4

0 回答 0