有人可以帮我动一下Flutter。
我正在尝试(导航到新屏幕并返回。)
在此处遵循指南:
https://flutter.dev/docs/cookbook/navigation/navigation-basics
但是我在这里遇到了这个错误:
引发了另一个异常:请求导航器操作并带有 不包含导航器的上下文。
这是我的简单Flutter代码:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget{
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp>{
@override
Widget build(BuildContext context){
return new MaterialApp(
title: 'Welcome',
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: Text('Welcome to view by view'),
),
body: Center(
child: Wrap(
children: <Widget>[
RaisedButton(
child: Text('View 2'),
onPressed: (){
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
},
)
],
),
),
)
);
}
}
class SecondRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Route"),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Go back!'),
),
),
);
}
}
谢谢!
答案 0 :(得分:0)
将需要访问Navigator的小部件包装到Builder中,或将该子树提取到类中。并使用新的BuildContext访问导航器。
答案 1 :(得分:0)
奇怪的是,文档会推荐一种破损的方法!只需将MaterialApp的主体提取到其自己的Widget中,它将起作用。这是代码:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget{
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp>{
@override
Widget build(BuildContext context){
return new MaterialApp(
title: 'Welcome',
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: Text('Welcome to view by view'),
),
body: FirstRoute(),
)
);
}
}
class FirstRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Wrap(
children: <Widget>[
RaisedButton(
child: Text('View 2'),
onPressed: (){
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
},
)
],
),
);
}
}
class SecondRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Route"),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Go back!'),
),
),
);
}
}
答案 2 :(得分:0)
是的,在波动示例中MaterialApp是
runApp(MaterialApp(
title: 'Navigation Basics',
home: FirstRoute(),
));
在示例FirstRoute中,它与MaterialApp分开。这样做是因为,如果我们将FirstRoute的内容直接放在MaterialApp内,则它将没有MaterialApp的上下文,并且无法访问Navigator。
您有2个选择。
将支架放置在它自己的无状态小部件中。
或将脚手架包装在构建器小部件中以使MaterialApp上下文可用
class _MyAppState extends State<MyApp>{
@override
Widget build(BuildContext context){
return new MaterialApp(
title: 'Welcome',
debugShowCheckedModeBanner: false,
home: Builder(builder: (BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Welcome to view by view'),
),
body: Center(
child: Wrap(
children: <Widget>[
RaisedButton(
child: Text('View 2'),
onPressed: (){
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
},
)
],
),
),
)})
);
}
}
this answer中的更多信息