在此小部件上方找不到正确的提供者 - 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(),
),
);
我是 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(),
),
);