Flutter 如何在没有状态的情况下使用Navigator 2.0进行导航?
我有一个非常简单的场景。一个按钮,按下该按钮将切换到下一个屏幕。在Navigator 1.0中,执行以下操作非常简单:Flutter 如何在没有状态的情况下使用Navigator 2.0进行导航?,flutter,flutter-navigation,Flutter,Flutter Navigation,我有一个非常简单的场景。一个按钮,按下该按钮将切换到下一个屏幕。在Navigator 1.0中,执行以下操作非常简单: ElevatedButton( onPressed: () { // Navigate to next screen. Navigator.push( context, MaterialPageRoute(builder: (context) => NextScreen()), ); }, child:
ElevatedButton(
onPressed: () {
// Navigate to next screen.
Navigator.push(
context,
MaterialPageRoute(builder: (context) => NextScreen()),
);
},
child: Text('Next Screen!'),
)
似乎使用Navigator 2.0
我需要一个状态来跟踪当前屏幕
...
Navigator(
pages: [
MainScreenPageRoute()
if (state.isNextScreen) {
NextScreenPageRoute()
}
],
onPopPage: (route, result) {
// would have to keep track of this value
state.isNextScreen = false;
return route.didPop(result);
},
)
...
至于以前,我不必仅仅为了导航而跟踪状态,在Navigator 2.0
中,它似乎是必需的。真的是这样吗?如果是这样的话,你们对如何正确处理这个问题有什么建议吗
附言。
这也让我感觉现在我必须跟踪状态,这比以前增加了更多的工作。是的,在navigator 2中,当您更改状态时,您会更改页面 有一些软件包可以帮助您避免这种情况,如 看这个例子
导入“包装:颤振/材料.省道”;
导入“包:qlevar_路由器/qlevar_路由器.dart”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
期末书籍=[
书(《异乡的陌生人》,《罗伯特·a·海因莱因》),
书籍(“基金会”、“艾萨克·阿西莫夫”),
书(‘华氏451度’、‘雷·布拉德伯里’),
];
@凌驾
小部件构建(构建上下文)=>MaterialApp.router(
routeInformationParser:QRouteInformationParser(),
routerDelegate:QRouterDelegate([
Q路由(路径:“/”,生成器:()=>BookListScreen(书籍)),
路线(
路径:
“/books/:id([0-${books.length-1}]),//唯一可用的页面是列表中的页面
生成器:()=>BookDetailsScreen(books[QR.params['id']!.asInt!]),
]));
}
课堂用书{
最后的字符串标题;
最终字符串作者;
书(这个标题,这个作者);
}
类BooksListScreen扩展了无状态小部件{
最终书目;
BookListScreen(this.books);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:ListView(
儿童:[
for(账簿中的账簿)
列表砖(
标题:文本(书名),
字幕:文本(书、作者),
onTap:()=>QR.to('/books/${books.indexOf(book)}'))
],
),
);
}
}
类BookDetailsScreen扩展了无状态小部件{
最后一本书;
BookDetailsScreen(this.book);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
主体:填充物(
填充:常数边集全部(8.0),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
文本(书名,样式:Theme.of(context.textTheme.headline6),
Text(book.author,style:Theme.of(context.textTheme.subtitle1),
],
),
),
);
}
}
别忘了在
pubspec.yaml
中添加qlevaru路由器:1.4.0
,问题是当你已经有一个状态需要跟踪时(在你的例子中选择了一本书),这是有意义的,但是如果你只需简单地推到下一个屏幕而不传递状态,这感觉就像是一种过度杀戮。