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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:45:02