Reputation: 51
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(),
},
));
}
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
Is there anyway to fix this ? I am using Provider version ^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();
}
}
Upvotes: 2
Views: 2450
Reputation: 865
You can try this way.
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AriticleProvider()),
ChangeNotifierProvider(create: (_) => FavoriteProvider()),
],
child: MyApp(),
),
);
Upvotes: 1
Reputation: 8264
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
Upvotes: 1