在此 AddSupervisor 小部件上方找不到正确的 Provider<SupervisorProvider>

Posted

技术标签:

【中文标题】在此 AddSupervisor 小部件上方找不到正确的 Provider<SupervisorProvider>【英文标题】:Could not find the correct Provider<SupervisorProvider> above this AddSupervisor Widget 【发布时间】:2021-01-27 23:16:36 【问题描述】:

HomeSupervisor 类

    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(),
      ),
    );
  

AddSupervisor 类

    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();
               
             ),
           ],
         ),
       ),
     ),
   );
  

SupervisorProvider 类

import 'package:flutter/cupertino.dart';
import 'package:fyp/model/Supervisor.dart';
import 'package:fyp/service/database.dart';
import 'package:uuid/uuid.dart';

class SupervisorProvider with ChangeNotifier

  final DatabaseService db = DatabaseService();
  String _name;
  String _email;
  String  _icNumber;
  String _numberphone;
  var uuid = Uuid();

  // getters
String get name => _name;
String get email => _email;
String get icNo => _icNumber;
String get nophone => _numberphone;

// setters
   changeName(String value)
     _name=value;
     notifyListeners();
   
  changeEmail(String value)
    _email=value;
    notifyListeners();
  
  changePhone(String value)
    _numberphone=value;
    notifyListeners();
  
  changeIcNumber(String value)
    _icNumber=value;
    notifyListeners();
  

  addSupervisor()
    var NewSupervisor = Supervisor(name: name, email: email, icNo: icNo, nophone: nophone, supervisorId: uuid.v4());
      db.addSupervisor(NewSupervisor);
  

然后我得到了这样的错误

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

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

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

提供者是“范围的”。因此,如果您在路线内插入提供者,那么 其他路由将无法访问该提供程序。

您使用了BuildContext,它是您尝试读取的提供程序的祖先。

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

例如,而不是:

小部件构建(BuildContext 上下文) 返回提供者( 创建:(_)=>示例(), // 会抛出一个ProviderNotFoundError,因为context是关联的 // 到作为Provider&lt;Example&gt; 父级的小部件 孩子:文本(context.watch()), ),

考虑像这样使用构建器:

小部件构建(BuildContext 上下文) 返回提供者( 创建:(_)=>示例(), // 我们使用builder 来获得一个新的BuildContext,它可以访问提供者 建设者:(上下文) // 不再抛出 返回文本(context.watch()), ),

如果这些解决方案都不起作用,请考虑在 *** 上寻求帮助: https://***.com/questions/tagged/flutter 相关的导致错误的小部件是: AddSupervisor file:///D:/android_project/fyp/lib/screen/home/HomeSupervisor.dart:20:83

有什么我想念的吗?我需要帮助

【问题讨论】:

您是否在根目录下创建了 SupervisorProvider,例如 MaterialApp 小部件附近,使用 MultiProvider 小部件并将 SupervisorProvider 添加为提供者之一 在根目录?你的意思是在 main.dart 中?没有。你能解释更多细节吗?因为我真的无法理解提供者的流程。 如何在根目录下创建SupervisorProvider? 我认为您只是复制代码而没有查看官方指南。 ???在进入任何领域之前,你应该先学习一些基础知识。 我已经看过官方指南并尝试了很多方法但仍然出现错误。 =( 【参考方案1】:

如果你想使用 Some class with provider,你必须向提供者提供你的类的一个实例,

例如我这样做


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,
        );
      ,
    );
  

所以在小部件树的下方,我可以使用 Provider.of(context) 访问这两个商店

【讨论】:

感谢您的建议回答。我会试试的。 做了这个方法后还是一样的错误=(【参考方案2】:
 class SearchingScreen extends StatelessWidget 
 AuthBase authBase = AuthBase();
@override
Widget build(BuildContext context) 
 return ChangeNotifierProvider(
  create: (_) => UserModel(),
  child:HomeView(),
);

【讨论】:

以上是关于在此 AddSupervisor 小部件上方找不到正确的 Provider<SupervisorProvider>的主要内容,如果未能解决你的问题,请参考以下文章

错误:在此 UpdateSupervisor 小部件上方找不到正确的 Provider<NewUser>

我无法修复:在此 ProductItem 小部件上方找不到正确的 Provider<AppUser>

ProviderNotFoundException(错误:在此主页小部件上方找不到正确的 Provider<EntryProvider>

错误:在此 Directioner 小部件上方找不到正确的 Provider<User>

我收到错误消息:在此设置小部件上方找不到正确的 Provider<User>(已修复)

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