![](/img/trans.png)
[英]Flutter Error: Could not find the correct Provider<MyUser> above this SettingsForm Widget
[英]Flutter : Could not find the correct Provider<EntryProvider> above this Page Widget
尝试运行时出错,但没有我可以修复的具体问题尝试了错误给出的示例,但没有运气。 该错误甚至说从stackoverflow寻求帮助,所以我在这里尝试从谷歌寻求帮助,但没有运气。
错误图片
为什么我的 Provider 在这种情况下会中断?
在我的页面内
@override
Widget build(BuildContext context) {
Widget build(BuildContext context) {
ChangeNotifierProvider<EntryProvider>
(
create: (_)=>EntryProvider(),
child:(MaterialWidget()),
);
final entryProvider = Provider.of<EntryProvider>(context);
return Scaffold(
appBar: AppBar(
title: Text('My Journal'),
),
body: StreamBuilder<List<Entry>>(
stream: entryProvider.entries,
builder: (context, snapshot) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return ListTile(
trailing:
Icon(Icons.edit, color: Theme.of(context).accentColor),
title: Text(
formatDate(DateTime.parse(snapshot.data[index].date),
[MM, ' ', d, ', ', yyyy]),
),
onTap: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) =>
EntryScreen(entry: snapshot.data[index])));
},
);
});
}),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => EntryScreen()));
},
),
);
}
}
在我的提供者内部
final firestoreService = FirestoreService();
DateTime _date;
String _entry;
String _entryId;
var uuid = Uuid();
//Getters
DateTime get date => _date;
String get entry => _entry;
Stream<List<Entry>> get entries => firestoreService.getEntries();
//Setters
set changeDate(DateTime date){
_date = date;
notifyListeners();
}
set changeEntry(String entry){
_entry = entry;
notifyListeners();
}
//Functions
loadAll(Entry entry){
if (entry != null){
_date = DateTime.parse(entry.date);
_entry =entry.entry;
_entryId = entry.entryId;
} else {
_date = DateTime.now();
_entry = null;
_entryId = null;
}
}
saveEntry(){
if (_entryId == null){
//Add
var newEntry = Entry(date: _date.toIso8601String(), entry: _entry, entryId: uuid.v1());
print(newEntry.entry);
firestoreService.setEntry(newEntry);
} else {
//Edit
var updatedEntry = Entry(date: _date.toIso8601String(), entry: _entry, entryId: _entryId);
firestoreService.setEntry(updatedEntry);
}
}
removeEntry(String entryId){
firestoreService.removeEntry(entryId);
}
}```
class EntryScreen extends StatefulWidget {
final Entry entry;
EntryScreen({this.entry});
@override
_EntryScreenState createState() => _EntryScreenState();
}
class _EntryScreenState extends State<EntryScreen> {
final entryController = TextEditingController();
@override
void dispose() {
entryController.dispose();
super.dispose();
}
@override
void initState() {
final entryProvider = Provider.of<EntryProvider>(context,listen: false);
if (widget.entry != null){
//Edit
entryController.text = widget.entry.entry;
entryProvider.loadAll(widget.entry);
} else {
//Add
entryProvider.loadAll(null);
}
super.initState();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<EntryProvider>
(
create: (_)=>EntryProvider(),
child: Scaffold(
body: Consumer<EntryProvider>(
builder: (context, entryProvider, child){
return Scaffold(
appBar: AppBar(title: Text(formatDate(entryProvider.date, [MM, ' ', d, ', ', yyyy])),
actions: [
IconButton(
icon: Icon(Icons.calendar_today),
onPressed: (){
_pickDate(context,entryProvider).then((value) {
if (value != null){
entryProvider.changeDate = value;
}
});
},
)
],),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: ListView(
children: [
TextField(
decoration: InputDecoration(
labelText: 'Daily Entry', border: InputBorder.none,
),
maxLines: 12,
minLines: 10,
onChanged: (String value) => entryProvider.changeEntry = value,
controller: entryController,
),
RaisedButton(
color: Theme.of(context).accentColor,
child: Text('Save',style: TextStyle(color: Colors.white)),
onPressed: () {
entryProvider.saveEntry();
Navigator.of(context).pop();
},
),
(widget.entry != null) ? RaisedButton(
color: Colors.red,
child: Text('Delete',style: TextStyle(color: Colors.white)),
onPressed: () {
entryProvider.removeEntry(widget.entry.entryId);
Navigator.of(context).pop();
},
): Container(),
],
),
),
);
}
)
)
);
}
Future<DateTime> _pickDate(BuildContext context, EntryProvider entryProvider) async {
final DateTime picked = await showDatePicker(
context: context, initialDate: entryProvider.date, firstDate: DateTime(2019),
lastDate: DateTime(2050));
if (picked != null) return picked;
}
}```
在我的另一个文件中做了同样的事情,但是那个文件仍然出现同样的错误
您需要在页面的父级中创建 ChangeNotifierProvider 小部件,以便它可以在获取提供程序后。 因为现在它试图寻找您的提供者并且在树中找不到它。
ChangeNotifierProvider<EntryProvider>(
create: (_) => EntryProvider(),
child: YourPageWidget(),
)
你的例子:
return ChangeNotifierProvider<EntryProvider>
(
create: (_)=>EntryProvider(),
child: Scaffold(
body: Consumer<EntryProvider>(
builder: (context, entryProvider, child){
return StreamBuilder<List<Entry>>(
stream: entryProvider.entries,
builder: (context, snapshot) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return ListTile(
trailing:
Icon(Icons.edit, color: Theme.of(context).accentColor),
title: Text(
formatDate(DateTime.parse(snapshot.data[index].date),
[MM, ' ', d, ', ', yyyy]),
),
onTap: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) =>
EntryScreen(entry: snapshot.data[index])));
},
);
});
});
},
),
)
);
更简单的选择,而不是试图包装小部件是包装主要,所以一切都在工作
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
StreamProvider<NUser>.value(
value: AuthService().user,
),
ChangeNotifierProvider<EntryProvider>(
create: (context) => EntryProvider(),
)
],
child: MaterialApp(
home:Wrapper(),
),
);```
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.