Flutter 找不到正确的提供程序<;监管者提供者>;在这个AddSupervisor小部件上面

Flutter 找不到正确的提供程序<;监管者提供者>;在这个AddSupervisor小部件上面,flutter,createprocess,flutter-change-notifier,Flutter,Createprocess,Flutter Change Notifier,家庭监督班 import 'package:flutter/material.dart'; import 'package:fyp/provider/supervisorProvider.dart'; import 'package:fyp/screen/AddSupervisor.dart'; import 'package:fyp/sidebar/AdminDrawer.dart'; import 'package:provider/provider.

家庭监督班

    import 'package:flutter/material.dart';
    import 'package:fyp/provider/supervisorProvider.dart';
    import 'package:fyp/screen/AddSupervisor.dart';
    import 'package:fyp/sidebar/AdminDrawer.dart';
    import 'package:provider/provider.dart';

    class HomeSupervisor extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    return ChangeNotifierProvider(
        create: (context) => SupervisorProvider(),
      child: Scaffold(
        appBar: AppBar(
            title: Text('Supervisor'),
          actions: <Widget>[
            IconButton(
                icon: Icon(
                  Icons.add,
                  color: Colors.white,
                ),
                onPressed:(){
                  Navigator.push(context, MaterialPageRoute(builder: (context) => AddSupervisor()));
                })
          ],
        ),
        drawer: AdminDrawer(),
      ),
    );
  }
}
    import 'package:flutter/material.dart';
    import 'package:fyp/provider/supervisorProvider.dart';
    import 'package:provider/provider.dart';

    class AddSupervisor extends StatefulWidget {


    @override
     _AddSupervisorState createState() => _AddSupervisorState();
    }

    class _AddSupervisorState extends State<AddSupervisor> {


    bool loading = false;

    @override
    Widget build(BuildContext context) {
    final supervisorProvider = Provider.of<SupervisorProvider>(context);
     return Scaffold(
     appBar: AppBar(
       title: Text('Supervisor'),
     ),
     body: SingleChildScrollView(
       child: Form(
         child: Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: <Widget>[
             SizedBox(height: 10.0),
             TextFormField(
               decoration: InputDecoration(labelText: 'Name',border: OutlineInputBorder()),
               keyboardType: TextInputType.text,
               validator: (value) => value.isEmpty ? 'Enter a name': null,
               onChanged: (value) {
                supervisorProvider.changeName(value);
               },
             ),
             SizedBox(height: 5.0),
             TextFormField(
               decoration: InputDecoration(labelText: 'Email',border: OutlineInputBorder()),
               keyboardType: TextInputType.emailAddress,
               validator: (value) => value.isEmpty ? 'Enter a email': null,
               onChanged: (value) {
                 supervisorProvider.changeEmail(value);
               },
             ),
             SizedBox(height: 5.0),
             TextFormField(
               decoration: InputDecoration(labelText: 'Number Phone',border: OutlineInputBorder()),
               keyboardType: TextInputType.number,
               validator: (value) => value.isEmpty ? 'Enter a Phone': null,
               onChanged: (value) {
                 supervisorProvider.changePhone(value);
               },
             ),
             SizedBox(height: 5.0),
             TextFormField(
               decoration: InputDecoration(labelText: 'Ic Number ',border: OutlineInputBorder()),
               keyboardType: TextInputType.number,
               validator: (value) => value.isEmpty ? 'Enter a ic number': null,
               onChanged: (value) {
                 supervisorProvider.changeIcNumber(value);
               },
             ),
             SizedBox(height: 10.0),
             RaisedButton(
               color: Colors.grey,
               textColor: Colors.black,
               child: Text("Submit"),
               onPressed:(){
                 supervisorProvider.addSupervisor();
                 Navigator.of(context).pop();
               }
             ),
           ],
         ),
       ),
     ),
   );
  }
}
然后我犯了这样的错误

错误:在此AddSupervisor小部件上方找不到正确的提供程序

这可能是因为您使用了不包含提供程序的
BuildContext
由你选择。有几个常见的场景:

  • 您试图读取的提供程序位于不同的路径中

    提供者是“有范围的”。所以,如果在路由中插入一个提供者,那么 其他路由将无法访问该提供商

  • 您使用了一个
    BuildContext
    ,它是您试图读取的提供程序的祖先

    确保AddSupervisor位于您的MultiProvider/Provider下。 这通常发生在创建提供者并尝试立即读取它时

    例如,而不是:

    小部件构建(构建上下文){ 返回提供者( 创建:()=>Example(), //将抛出ProviderNotFoundError,因为关联了
    上下文
    //到作为
    提供者的父级的小部件
    子:文本(context.watch()), ), }

    考虑像这样使用builder:

    小部件构建(构建上下文){ 返回提供者( 创建:()=>Example(), //我们使用
    builder
    获取一个新的
    BuildContext
    ,该上下文可以访问提供者 生成器:(上下文){ //不再投掷 返回文本(context.watch()), } ), }

如果这些解决方案都不起作用,请考虑在StAcExpLoad上寻求帮助: 导致错误的相关小部件是: AddSupervisorfile:///D:/Android_project/fyp/lib/screen/home/HomeSupervisor.dart:20:83


我遗漏了什么吗?我需要有人帮助

如果您想使用某个类和提供程序,您必须向提供程序提供一个类的实例

例如,我这样做


class App extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        Provider<ThemeStore>(
          create: (_) => ThemeStore(),
        ),
        Provider<AuthStore>(
          create: (_)=> AuthStore(),
        ),
      ],
      builder: (context,w){
        return MaterialApp(
          title: "App",
          theme: context.watch<ThemeStore>().selectedThemeData,
          initialRoute: "/",
          onGenerateRoute: RouteManager.onGenerate,
        );
      },
    );
  }
}

类应用程序扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
回程多供应商(
供应商:[
提供者(
创建:()=>ThemeStore(),
),
提供者(
创建:()=>AuthStore(),
),
],
生成器:(上下文,w){
返回材料PP(
标题:“应用程序”,
主题:context.watch()。选择主题数据,
初始路径:“/”,
onGenerateRoute:RouteManager.onGenerate,
);
},
);
}
}
因此,在小部件树的更深处,我可以使用
Provider.of(context)

}
}

您是否在根目录下创建了SupervisorProvider,例如在MaterialApp小部件附近,使用MultiProvider小部件并将SupervisorProvider添加为根目录下的提供程序之一?你是说主要的,飞镖?不。你能解释更多细节吗?因为我真的无法理解提供者的流程。如何在根目录下创建SupervisorProvider?我认为您只是复制了代码,而没有查看官方指南。我已经看了官方的指南,尝试了很多方法,但仍然得到了错误=(谢谢你的建议答案。我会尝试一下。在使用这种方法之后,我仍然得到同样的错误=(

class App extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        Provider<ThemeStore>(
          create: (_) => ThemeStore(),
        ),
        Provider<AuthStore>(
          create: (_)=> AuthStore(),
        ),
      ],
      builder: (context,w){
        return MaterialApp(
          title: "App",
          theme: context.watch<ThemeStore>().selectedThemeData,
          initialRoute: "/",
          onGenerateRoute: RouteManager.onGenerate,
        );
      },
    );
  }
}
 class SearchingScreen extends StatelessWidget {
 AuthBase authBase = AuthBase();
@override
Widget build(BuildContext context) {
 return ChangeNotifierProvider(
  create: (_) => UserModel(),
  child:HomeView(),
);