在此小部件上方找不到正确的提供者 - Flutter

Could not find the correct Provider above this Widget - Flutter

我是 Flutter 的新手,我在我的 Flutter 应用程序中使用 Provider,我的 main.dart 文件如下所示:

import 'package:flutter/material.dart';
import 'package:provider_practice/screens/first_screen.dart';
import 'package:provider_practice/screens/second_screen.dart';
import 'package:provider/provider.dart';
import 'package:provider_practice/counter.dart';

void main() {
  runApp(MaterialApp(

    home: ChangeNotifierProvider<Counter>(
      create: (context) => Counter(),
      child: FirstScreen(),
    ),

    routes: {
      "/first" : (context) => FirstScreen(),
      "/second" : (context) => SecondScreen(),
    },
  ));
}

我的代码在 FirstScreen() 上运行良好,但是当我导航到 SecondScreen() 时(通过使用 Navigator.pushNamed()),我收到以下错误:

The following ProviderNotFoundException was thrown building SecondScreen(dirty):
Error: Could not find the correct Provider<Counter> above this SecondScreen Widget

有办法解决这个问题吗?我使用的是 Provider 版本 ^5.0.0

first_screen.dart :-

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:provider_practice/counter.dart';

class FirstScreen extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    final counter = Provider.of<Counter>(context , listen: false);

    return Scaffold(
      appBar: AppBar(
        title: Text("First Screen"),
      ),

      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Consumer<Counter>(
                  builder: (_ , counter , __) => Text("You pressed the button 
${counter.firstCounter} times.")
              ),
              SizedBox(height: 20),
              RaisedButton(
                onPressed: counter.firstIncrement,
                child: Text("Click Me"),
              ),
              SizedBox(height: 20),
              RaisedButton(
                onPressed: () {
                  Navigator.pushNamed(context, "/second");
                },
                child: Text("Go to Second"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

second_screen.dart :-

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:provider_practice/counter.dart';

class SecondScreen extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    final counter = Provider.of<Counter>(context , listen: false);

    return Scaffold(
      appBar: AppBar(
        title: Text("Second Screen"),
      ),

      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Consumer<Counter>(
                  builder: (_ , counter , __) => Text("You pressed the button 
${counter.secondCounter} times.")
              ),
              SizedBox(height: 20),
              RaisedButton(
                onPressed: counter.secondIncrement,
                child: Text("Click Me"),
              ),
              SizedBox(height: 20),
              RaisedButton(
                onPressed: () {
                  //Navigator.maybePop(context);
                  Navigator.pushNamed(context, "/first");
                  //Navigator.pop(context);
                },
                child: Text("Go to First"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

counter.dart :-

import 'package:flutter/foundation.dart';

class Counter with ChangeNotifier {
  int firstCounter = 0;
  int secondCounter = 0;

  void firstIncrement() {
    firstCounter++;
    notifyListeners();
  }

  void secondIncrement() {
    secondCounter++;
    notifyListeners();
  }
}

如果没有看到您的代码的可重现片段,我们将无能为力, 无论如何,您可以在 material 应用程序之前 return 一个多供应商,并在此处添加您的供应商

....
return MultiProvider(
      providers: [
        ChangeNotifierProvider<Counter>(
            create: (context) => Counter()),
]
child:MaterialApp

你可以这样试试

runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => AriticleProvider()),
        ChangeNotifierProvider(create: (_) => FavoriteProvider()),
      ],
      child: MyApp(),
    ),
  );