我使用go_*路由器在屏幕之间导航,不幸的是,它会导致每次在当前页面和我导航到的页面上重建。在大多数页面上,我从Firebase读取文档,这会导致不必要的读取。作为替代方案,我使用Navigator来实现页面之间的导航,而无需重新构建。是否有可能实现相同的效果与go_*路由器?
Navigator.push(context,MaterialPageRoute(builder: (context) => SecondScreen(),); (rebuild on screen2)
context.go("/secondScreen") (rebuilds on screen1 and screen2)
我将使用Navigator代替go_router。
我相信我也有同样的问题。当我使用context.push()
或context.pop()
时,堆栈树中的所有页面状态都再次运行,这导致已经存在的页面状态丢失。我意识到的是pageBuilder之间的区别,builder方法。为了使用pageBuilder方法,你需要调用MaterialPage<void>
,它将每次构建页面。
解决方案:用builder
代替pageBuilder
不使用pageBuilder;
GoRoute(
path: '/',
pageBuilder: (context, state) => MaterialPage<void>(
key: ValueKey<String>(state.fullPath! +
DateTime.now().millisecondsSinceEpoch.toString()),
child: HomePage(),
),
),
使用生成器;
GoRoute(
path: '/',
builder: (context, state) {
return HomePage();
},
),