在此 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<Example>
父级的小部件
孩子:文本(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>