栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

A.导航

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

因此,首先,我们需要弄清楚如何收听此更改,例如“推送”屏幕,“弹出回到用户”屏幕。

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行),设置表以及插入表的方法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/427706.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号