Flutter持久化登录状态:根据本地token判断初始页是AuthScreen还是DashboardScreen
实现方案
方案1:使用FutureBuilder内置判断(最常用)
你需要通过Flutter内置的FutureBuilder组件处理异步逻辑,将判断逻辑放到MaterialApp的home属性位置,完整示例代码如下:
import 'package:flutter/material.dart'; // 导入你自己的页面和storage依赖 import 'auth_screen.dart'; import 'dashboard_screen.dart'; // 你的getSession方法 Future<String?> getSession() => storage.read(key: "token"); class MyApp extends StatefulWidget { const MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { // 提前缓存future,避免组件重build时重复执行getSession late final Future<String?> _sessionFuture; @override void initState() { super.initState(); _sessionFuture = getSession(); } @override Widget build(BuildContext context) { return MaterialApp( title: '你的应用名称', // 其他配置项比如theme、routes等保留原有配置 home: FutureBuilder<String?>( future: _sessionFuture, builder: (context, snapshot) { // 等待异步结果时展示加载页 if (snapshot.connectionState == ConnectionState.waiting) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } // 读取出错或token为空时走登录页 if (snapshot.hasError || snapshot.data == null || snapshot.data!.isEmpty) { return const AuthScreen(); } // token存在时走首页 return const DashboardScreen(); }, ), ); } }
注意事项:
- 确保你使用的存储组件(比如SharedPreferences、FlutterSecureStorage)已经完成初始化,否则读取操作会抛出异常
- 加载页可以根据你的设计需求替换为自定义的启动页
方案2:main函数提前初始化(适合需要提前加载多个全局依赖的场景)
你也可以在main函数的runApp执行前就完成token读取,这样不需要在组件层处理异步等待:
void main() async { // 确保Flutter框架初始化完成 WidgetsFlutterBinding.ensureInitialized(); // 初始化存储组件+读取token await storage.init(); // 对应你存储组件的初始化方法 final String? token = await getSession(); // 直接判断初始页 runApp(MyApp(initialHome: token != null ? const DashboardScreen() : const AuthScreen())); } class MyApp extends StatelessWidget { final Widget initialHome; const MyApp({super.key, required this.initialHome}); @override Widget build(BuildContext context) { return MaterialApp( title: '你的应用名称', home: initialHome, // 其他原有配置保留 ); } }
这个方案的优势是不会在应用启动后出现短暂的加载动画,启动体验更流畅,适合不需要动态判断初始页的场景。
内容的提问来源于stack exchange,提问作者Asim Bhadra
相关产品推荐
相关产品推荐

