【问题标题】:Could not find the correct Provider<SupervisorProvider> above this AddSupervisor Widget在此 AddSupervisor 小部件上方找不到正确的 Provider<SupervisorProvider>
【发布时间】: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()), } ), }

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

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

【问题讨论】:

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

标签: flutter createprocess flutter-change-notifier


【解决方案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(),
);

} }

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 2021-08-24
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多