Flutter:如何保留屏幕状态,关闭应用后返回最后打开页面?
Flutter 保留屏幕会话状态的替代方案
除了SharedPreferences,以下几种方案可以实现应用重启后恢复到最后打开的屏幕:
1. Hive 轻量级NoSQL数据库
Hive是专为Flutter设计的轻量级本地数据库,支持存储自定义对象,操作高效,适合存储页面路由、状态参数这类数据。
实现步骤:
- 添加依赖:
hive和hive_flutter - 初始化Hive,注册自定义对象适配器(如果需要存储非基础类型)
- 在页面切换或应用退出前保存当前路由信息,启动时读取并跳转
示例代码:
import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.dart'; // 初始化Hive void initHive() async { await Hive.initFlutter(); await Hive.openBox('app_state'); } // 保存当前路由 void saveCurrentRoute(String routeName) { final box = Hive.box('app_state'); box.put('last_route', routeName); } // 获取最后路由并跳转 Future<void> restoreLastRoute(BuildContext context) async { final box = Hive.box('app_state'); final lastRoute = box.get('last_route', defaultValue: '/home'); Navigator.pushReplacementNamed(context, lastRoute); }
2. SQLite(sqflite插件)
适合需要存储结构化、大量状态数据的场景,支持SQL查询,比如需要记录用户的页面访问历史。
实现步骤:
- 添加依赖:
sqflite和path_provider - 创建数据库表存储路由及时间戳信息
- 页面切换时插入/更新记录,启动时查询最新记录完成跳转
示例代码:
import 'package:sqflite/sqflite.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart'; Database? _db; // 初始化数据库 Future<void> initDb() async { final dir = await getApplicationDocumentsDirectory(); final path = join(dir.path, 'app_state.db'); _db = await openDatabase( path, version: 1, onCreate: (db, version) async { await db.execute(''' CREATE TABLE routes( id INTEGER PRIMARY KEY AUTOINCREMENT, route_name TEXT, timestamp INTEGER ) '''); }, ); } // 保存当前路由 Future<void> saveCurrentRoute(String routeName) async { await _db?.insert( 'routes', {'route_name': routeName, 'timestamp': DateTime.now().millisecondsSinceEpoch}, conflictAlgorithm: ConflictAlgorithm.replace, ); } // 恢复最后路由 Future<void> restoreLastRoute(BuildContext context) async { final result = await _db?.query( 'routes', orderBy: 'timestamp DESC', limit: 1, ); if (result != null && result.isNotEmpty) { final lastRoute = result.first['route_name'] as String; Navigator.pushReplacementNamed(context, lastRoute); } }
3. GetStorage(GetX生态)
GetStorage是GetX提供的轻量级持久化存储,API比SharedPreferences更简洁,支持存储Map、List等复杂类型,无需大量初始化代码。
实现步骤:
- 添加依赖:
get_storage - 初始化GetStorage
- 存储和读取路由信息
示例代码:
import 'package:get_storage/get_storage.dart'; final box = GetStorage(); // 初始化(在应用启动时调用) void initGetStorage() async { await GetStorage.init(); } // 保存当前路由 void saveCurrentRoute(String routeName) { box.write('last_route', routeName); } // 恢复最后路由 void restoreLastRoute(BuildContext context) { final lastRoute = box.read('last_route') ?? '/home'; Navigator.pushReplacementNamed(context, lastRoute); }
4. Flutter Secure Storage
如果需要存储敏感的页面状态信息(比如包含用户隐私的页面路由),可以用这个加密存储方案,数据会被加密后存储在系统安全区域。
实现步骤:
- 添加依赖:
flutter_secure_storage - 存储和读取加密后的路由信息
示例代码:
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; final storage = FlutterSecureStorage(); // 保存当前路由 Future<void> saveCurrentRoute(String routeName) async { await storage.write(key: 'last_route', value: routeName); } // 恢复最后路由 Future<void> restoreLastRoute(BuildContext context) async { final lastRoute = await storage.read(key: 'last_route') ?? '/home'; Navigator.pushReplacementNamed(context, lastRoute); }
内容的提问来源于stack exchange,提问作者Carlos Peñaranda
相关产品推荐
相关产品推荐

