我无法通过推送到当前导航器的小部件访问提供程序:
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyModel with ChangeNotifier {
String a = 'Test1';
String b = 'Test2';
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: ChangeNotifierProvider(
create: (context) => MyModel(),
child: MyHomePage()
)
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Consumer<MyModel>(
builder: (context, myModel, child) =>
Scaffold(
appBar: AppBar(
title: Text(myModel.a),
),
floatingActionButton: FloatingActionButton(
onPressed: () =>
Navigator.of(context).push(
PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => Page2(),
),
),
tooltip: 'Press',
child: Icon(Icons.add),
),
)
);
}
}
class Page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
var myModel = Provider.of<MyModel>(context); // A
return Scaffold(
appBar: AppBar(
title: Text(myModel.b),
),
);
}
}
我收到此错误:
The following ProviderNotFoundException was thrown building Page2(dirty):
Error: Could not find the correct Provider<MyModel> above this Navigator Widget
问题似乎是Page2小部件中的BuildContext对象与与提供者关联的BuildContext不同。如果我将原始上下文的引用传递给Page2并在(A)点使用该引用,则一切正常,但这似乎并不是解决此问题的好方法。
我通过将Navigator.of(context, rootNavigator: true).context
用作Page2的build
方法内的上下文,尝试了解决方法here,但是我仍然遇到相同的异常。
答案 0 :(得分:3)
Yo必须在根窗口小部件中传递提供程序,以便在导航到另一个页面时可以从任何位置访问该模型,因此您必须将提供程序传递给MaterialApp的父级
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyModel with ChangeNotifier {
String a = 'Test1';
String b = 'Test2';
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => MyModel(),
child: MaterialApp(title: 'Flutter Demo', home: MyHomePage()),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Consumer<MyModel>(
builder: (context2, myModel, child) => Scaffold(
appBar: AppBar(
title: Text(myModel.a),
),
floatingActionButton: FloatingActionButton(
onPressed: () => Navigator.of(context).push(
PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) =>
Page2(),
),
),
tooltip: 'Press',
child: Icon(Icons.add),
),
));
}
}
class Page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
var myModel = Provider.of<MyModel>(context); // A
return Scaffold(
appBar: AppBar(
title: Text(myModel.b),
),
);
}
}