繁体   English   中英

Flutter:找不到正确的提供程序<entryprovider>在此页面小部件上方</entryprovider>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM