在此小部件上方找不到正确的提供者-Flutter [英] Could not find the correct Provider above this Widget - Flutter

查看:238
本文介绍了在此小部件上方找不到正确的提供者-Flutter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Flutter的新手,并且在Flutter App中使用Provider,并且main.dart文件如下所示:

I am new to Flutter and I am using Provider in my Flutter App and my main.dart file looks like this :

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())时,出现以下错误:

My code works fine on FirstScreen() but when I navigate to SecondScreen() (by using Navigator.pushNamed()), I get the following error :

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

反正有解决此问题的方法吗?我正在使用提供程序版本^ 5.0.0

Is there anyway to fix this ? I am using Provider version ^5.0.0

first_screen.dart:-

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:-

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:-

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();
  }
}

推荐答案

我们看不到可复制的代码段,我们无法帮助,无论如何,您都可以在使用实质性应用之前先返回一个多提供商,然后在此处添加您的提供商

Without seeing reproducable snippets of your code we cant help, anyway you can return a multiprovider before material app and add your provider here

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

这篇关于在此小部件上方找不到正确的提供者-Flutter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆