【问题标题】:Could not find the correct Provider above this Widget - Flutter在此小部件上方找不到正确的提供程序 - Flutter
【发布时间】:2021-07-22 13:47:52
【问题描述】:

我是 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

有没有办法解决这个问题?我正在使用提供程序版本 ^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();
  }
}

【问题讨论】:

  • 这能回答你的问题吗? Could not find the correct Provider - Flutter
  • 不,它没有回答我的问题。
  • 你能告诉我我需要在我的代码中做哪些更改吗?
  • 你能提供一些你的第二个屏幕的代码吗?
  • 我已经添加了,检查一下。

标签: flutter dart flutter-provider


【解决方案1】:

如果没有看到您的代码的可重现 sn-ps,我们无能为力, 无论如何,您可以在材料应用程序之前返回一个多提供者并在此处添加您的提供者

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

【讨论】:

    【解决方案2】:

    你可以试试这个方法。

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

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2020-09-18
      • 2021-11-18
      • 2021-01-13
      • 2021-11-11
      • 2020-12-01
      • 2021-11-19
      • 2020-08-04
      • 2020-07-26
      相关资源
      最近更新 更多