如何在Flutter应用程序中保存上次打开的屏幕

如何在Flutter应用程序中保存上次打开的屏幕,第1张

如何在Flutter应用程序中保存上次打开的屏幕 A.导航

实际上,当我们在应用程序中的不同屏幕之间导航时,路线堆栈正在发生变化。

因此,首先,我们需要弄清楚如何收听此更改,例如“推送”屏幕,“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
类如下:

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);  }}
B. 如何启动应用

当用户通过屏幕进行交互时,共享首选项将始终
存储最后的路线名称。为了使应用程序进行相应的导航,我们需要
使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_provider
package 为其手动设置Path 。

此外,如果使用SQLite,则需要设置数据库(可能包括多于8行),设置表以及插入表的方法。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5090447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存