实际上,当我们在应用程序中的不同屏幕之间导航时,路线堆栈正在发生变化。
因此,首先,我们需要弄清楚如何收听此更改,例如“推送”屏幕,“d出回到用户”屏幕。
1.在每个 *** 作按钮中附加保存方法
我们实际上可以将其放在每个与导航相关的按钮上。
一个。抽屉物品
ListTile( title: Text("Beta"), onTap: () { saveLastScreen(); // saving to SharedPref here Navigator.of(context).pushNamed('/beta'); // then push }, ),
b. 在标题栏后退按钮上
appBar: AppBar( title: Text("Screen"), leading: IconButton( icon: Icon(Icons.menu), onPressed: () { saveLastScreen(); // saving to SharedPref here Navigator.pop(context); // then pop }, ), ),
c. 并在Android设备上捕获“电话返回”按钮的事件
@override Widget build(BuildContext context) { return WillPopScope( onWillPop: (){ // will triggered as we click back button saveLastScreen(); // saving to SharedPref here return Future.value(true); }, child: Scaffold( appBar: AppBar( title: Text("base Screen"), ),
因此,我们将拥有更多的代码,并且将更加难以管理。
2. 使用以下方法收听路线更改 Route observer尽管如此,Flutter在MaterialApp上提供了一些
“ middleware”来捕获路径堆栈中的那些更改。
我们的MyApp小部件上可能有这个:
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Save Last Route', navigatorObservers: <NavigatorObserver>[ MyRouteObserver(), // this will listen all changes ], routes: { '/': (context) { return baseScreen(); }, '/alpha': (context) { return ScreenAlpha(); },
我们可以定义
MyRouteObserver类如下:
B. 如何启动应用class MyRouteObserver extends RouteObserver { void saveLastRoute(Route lastRoute) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString('last_route', lastRoute.settings.name); } @override void didPop(Route route, Route previousRoute) { saveLastRoute(previousRoute); // note : take route name in stacks below super.didPop(route, previousRoute); } @override void didPush(Route route, Route previousRoute) { saveLastRoute(route); // note : take new route name that just pushed super.didPush(route, previousRoute); } @override void didRemove(Route route, Route previousRoute) { saveLastRoute(route); super.didRemove(route, previousRoute); } @override void didReplace({Route newRoute, Route oldRoute}) { saveLastRoute(newRoute); super.didReplace(newRoute: newRoute, oldRoute: oldRoute); }}
当用户通过屏幕进行交互时,共享首选项将始终
存储最后的路线名称。为了使应用程序进行相应的导航,我们需要
使baseScreen statefull并覆盖其initState方法,如下所示:
return MaterialApp( routes: { '/': (context) { return baseScreen(); // define it as Main Route },class baseScreen extends StatefulWidget { @override _baseScreenState createState() => _baseScreenState();}class _baseScreenState extends State<baseScreen> { @override void initState() { super.initState(); navigateToLastPage(); } void navigateToLastPage() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); String lastRoute = prefs.getString('last_route'); // No need to push to another screen, if the last route was root if (lastRoute.isNotEmpty && lastRoute != '/') { Navigator.of(context).pushNamed(lastRoute); } }
C.工作仓库您可能会看到该存储库覆盖了RouteObserver,如上面第二个选项所述
在不同的开始中保存和打开Screen Beta和Screen Delta
D.共享首选项/ JSON / SQLite为了简化起见,我建议使用“共享”首选项。由于我们只记录了
简单的String作为路由名称,因此我们只能将两行代码保存到Save中,将
两行代码写入Load。
如果使用JSON文件,则需要使用
path_providerpackage 为其手动设置Path 。
此外,如果使用SQLite,则需要设置数据库(可能包括多于8行),设置表以及插入表的方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)