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
有什么我想念的吗?我需要有人帮助