Flutter 我们应该使用哪一种不同的导航选项?
背景 颤振提供了两种不同的导航选项 选项1。在MaterialPage路由中使用小部件类。Flutter 我们应该使用哪一种不同的导航选项?,flutter,Flutter,背景 颤振提供了两种不同的导航选项 选项1。在MaterialPage路由中使用小部件类。 class FirstRoute扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回脚手架( appBar:appBar( 标题:文本(“第一条路线”), ), 正文:中( 孩子:升起按钮( 子项:文本(“开放路线”), 已按下:(){ 导航器。推( 上下文 MaterialPartnerRoute(生成器:(上下文)=>SecondRoute()), ); }, ), ), ); } } 类S
class FirstRoute扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第一条路线”),
),
正文:中(
孩子:升起按钮(
子项:文本(“开放路线”),
已按下:(){
导航器。推(
上下文
MaterialPartnerRoute(生成器:(上下文)=>SecondRoute()),
);
},
),
),
);
}
}
类SecondRoute扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第二条路线”),
),
正文:中(
孩子:升起按钮(
已按下:(){
Navigator.pop(上下文);
},
child:Text('Go back!'),
),
),
);
}
}
关键部分
Navigator.push(
上下文
MaterialPartnerRoute(生成器:(上下文)=>SecondRoute()),
);
使用Navigator push方法并将SecondRoute实例传递给MaterialPagerRoute构造函数
如果需要传递参数
class FirstRoute扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第一条路线”),
),
正文:中(
孩子:升起按钮(
子项:文本(“开放路线”),
已按下:(){
导航器。推(
上下文
//通过SecondRoute构造函数传递的参数。
MaterialPage路由(生成器:(上下文)=>SecondRoute(消息:“第二视图的消息”),
);
},
),
),
);
}
}
类SecondRoute扩展了无状态小部件{
//这是SecondRoute需要的参数。
最终字符串消息;
SecondRoute({@required this.message});
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第二条路线”),
),
正文:中(
孩子:升起按钮(
已按下:(){
Navigator.pop(上下文);
},
child:Text('Go back!'),
),
),
);
}
}
选项2。使用路线。
class FirstScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第一屏”),
),
正文:中(
孩子:升起按钮(
子项:文本(“启动屏幕”),
已按下:(){
//使用命名路线导航到第二个屏幕。
Navigator.pushNamed(上下文“/second”);
},
),
),
);
}
}
类SecondScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第二屏”),
),
正文:中(
孩子:升起按钮(
已按下:(){
//通过弹出当前路线导航回第一个屏幕
//现成的
Navigator.pop(上下文);
},
child:Text('Go back!'),
),
),
);
}
}
关键部分
Navigator.pushNamed(上下文“/second”);
还需要在MaterialApp中注册路线
void main(){
runApp(材料应用程序)(
标题:“命名路线演示”,
//使用“/”命名路由启动应用程序。在我们的情况下,应用程序将启动
//在FirstScreen小部件上
initialRoute:“/”,
路线:{
//当我们导航到“/”路径时,构建FirstScreen小部件
“/”:(上下文)=>FirstScreen(),
//当我们导航到“/second”路径时,构建SecondScreen小部件
“/second”:(上下文)=>SecondScreen(),
},
));
}
如果需要传递参数
//当用户点击按钮时,导航到指定路线
//并将参数作为可选参数提供。
Navigator.pushNamed(
上下文
“/秒”,
参数:“第二个视图的消息。”,
);
需要做一些额外的工作来获取参数
class SecondScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
//从路由获取参数。允许使用任何类型的参数。
最终字符串消息=ModalRoute.of(context).settings.arguments;
返回脚手架(
appBar:appBar(
标题:文本(“第二屏”),
),
正文:中(
孩子:升起按钮(
已按下:(){
//通过弹出当前路线导航回第一个屏幕
//现成的
Navigator.pop(上下文);
},
child:Text('Go back!'),
),
),
);
}
}
两个选项
- 小部件
- 简单易用
- 此小部件可由导航或小部件树使用
- 路线
- MaterialApp中的额外路由配置
- 从路由检索参数的额外工作
- 看起来没有对参数类型进行编译时检查
- 无法在小部件树中使用,因为没有路由参数
- 从生产准备系统中,我们应该选择哪个选项
- 为什么选择一个而不是另一个
我认为不应该使用一种或另一种,为什么不能同时使用两种,但这取决于项目结构和产品要求 我通常会这样做:
- 如果新屏幕取决于某些参数,任何参数,我将使用您的fi