【发布时间】: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();
}
}
【问题讨论】:
-
不,它没有回答我的问题。
-
你能告诉我我需要在我的代码中做哪些更改吗?
-
你能提供一些你的第二个屏幕的代码吗?
-
我已经添加了,检查一下。
标签: flutter dart flutter-provider