Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 我们应该使用哪一种不同的导航选项?_Flutter - Fatal编程技术网

Flutter 我们应该使用哪一种不同的导航选项?

Flutter 我们应该使用哪一种不同的导航选项?,flutter,Flutter,背景 颤振提供了两种不同的导航选项 选项1。在MaterialPage路由中使用小部件类。 class FirstRoute扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回脚手架( appBar:appBar( 标题:文本(“第一条路线”), ), 正文:中( 孩子:升起按钮( 子项:文本(“开放路线”), 已按下:(){ 导航器。推( 上下文 MaterialPartnerRoute(生成器:(上下文)=>SecondRoute()), ); }, ), ), ); } } 类S

背景

颤振提供了两种不同的导航选项

选项1。在MaterialPage路由中使用小部件类。

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