0

Home主管班

    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不包括您选择的提供者的 a。有几种常见的场景:

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

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

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

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

    例如,而不是:

    Widget build(BuildContext context) { return Provider( create: (_) => Example(), // 将抛出 ProviderNotFoundError,因为context// 关联到作为Provider<Example> child 父级的小部件:Text(context.watch() ), ), }

    考虑像这样使用构建器:

    Widget build(BuildContext context) { return Provider( create: (_) => Example(), // 我们builder用来获取一个BuildContext可以访问提供者的 new builder: (context) { // 不再抛出 return Text(context 。手表()), } ), }

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

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

4

2 回答 2

0
 class SearchingScreen extends StatelessWidget {
 AuthBase authBase = AuthBase();
@override
Widget build(BuildContext context) {
 return ChangeNotifierProvider(
  create: (_) => UserModel(),
  child:HomeView(),
);

} }

于 2021-05-15T16:06:22.533 回答
0

如果你想使用 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)

于 2020-10-13T16:11:29.370 回答