Flutter 找不到正确的提供程序<;监管者提供者>;在这个AddSupervisor小部件上面
家庭监督班Flutter 找不到正确的提供程序<;监管者提供者>;在这个AddSupervisor小部件上面,flutter,createprocess,flutter-change-notifier,Flutter,Createprocess,Flutter Change Notifier,家庭监督班 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.
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(),
),
);
}
}
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();
}
),
],
),
),
),
);
}
}
然后我犯了这样的错误
错误:在此AddSupervisor小部件上方找不到正确的提供程序
这可能是因为您使用了不包含提供程序的BuildContext
由你选择。有几个常见的场景:
- 您试图读取的提供程序位于不同的路径中 提供者是“有范围的”。所以,如果在路由中插入一个提供者,那么 其他路由将无法访问该提供商
- 您使用了一个
,它是您试图读取的提供程序的祖先 确保AddSupervisor位于您的MultiProvider/Provider下。 这通常发生在创建提供者并尝试立即读取它时 例如,而不是: 小部件构建(构建上下文){ 返回提供者( 创建:()=>Example(), //将抛出ProviderNotFoundError,因为关联了BuildContext
上下文 //到作为
子:文本(context.watch()), ), } 考虑像这样使用builder: 小部件构建(构建上下文){ 返回提供者( 创建:()=>Example(), //我们使用提供者的父级的小部件
获取一个新的builder
,该上下文可以访问提供者 生成器:(上下文){ //不再投掷 返回文本(context.watch()), } ), }BuildContext
如果这些解决方案都不起作用,请考虑在StAcExpLoad上寻求帮助: 导致错误的相关小部件是: AddSupervisorfile:///D:/Android_project/fyp/lib/screen/home/HomeSupervisor.dart:20:83
我遗漏了什么吗?我需要有人帮助如果您想使用某个类和提供程序,您必须向提供程序提供一个类的实例 例如,我这样做
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,
);
},
);
}
}
类应用程序扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
回程多供应商(
供应商:[
提供者(
创建:()=>ThemeStore(),
),
提供者(
创建:()=>AuthStore(),
),
],
生成器:(上下文,w){
返回材料PP(
标题:“应用程序”,
主题:context.watch()。选择主题数据,
初始路径:“/”,
onGenerateRoute:RouteManager.onGenerate,
);
},
);
}
}
因此,在小部件树的更深处,我可以使用Provider.of(context)
}
}您是否在根目录下创建了SupervisorProvider,例如在MaterialApp小部件附近,使用MultiProvider小部件并将SupervisorProvider添加为根目录下的提供程序之一?你是说主要的,飞镖?不。你能解释更多细节吗?因为我真的无法理解提供者的流程。如何在根目录下创建SupervisorProvider?我认为您只是复制了代码,而没有查看官方指南。我已经看了官方的指南,尝试了很多方法,但仍然得到了错误=(谢谢你的建议答案。我会尝试一下。在使用这种方法之后,我仍然得到同样的错误=(
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,
);
},
);
}
}
class SearchingScreen extends StatelessWidget {
AuthBase authBase = AuthBase();
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => UserModel(),
child:HomeView(),
);