You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:05:12