我是 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
第一个屏幕.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"),
),
],
),
),
),
);
}
}
反飞镖:-
import 'package:flutter/foundation.dart';
class Counter with ChangeNotifier {
int firstCounter = 0;
int secondCounter = 0;
void firstIncrement() {
firstCounter++;
notifyListeners();
}
void secondIncrement() {
secondCounter++;
notifyListeners();
}
}