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

Flutter如何检测用户首次打开应用,仅展示一次引导教程?

实现Flutter应用首次打开仅显示引导教程的方案

核心思路是用本地持久化存储记录用户是否已经打开过应用,这里推荐使用shared_preferences包(轻量、适合存储简单键值对),通过一个布尔值标记用户是否是首次启动,以此决定是否展示引导教程。

具体实现步骤

  1. 添加依赖
    在项目的pubspec.yaml文件中添加shared_preferences依赖:
dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.2.2 # 版本号以最新官方为准

执行flutter pub get安装依赖。

  1. 编写检测与展示逻辑
    可以在应用启动入口或首页的initState中处理检测逻辑,这里用FutureBuilder处理异步获取存储数据的场景:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FutureBuilder<bool>(
        // 异步获取首次启动标记
        future: _checkFirstLaunch(),
        builder: (context, snapshot) {
          // 等待数据加载时显示加载状态
          if (!snapshot.hasData) {
            return const Scaffold(body: Center(child: CircularProgressIndicator()));
          }
          // 根据标记决定展示教程还是主页面
          return snapshot.data! ? const TutorialScreen() : const HomeScreen();
        },
      ),
    );
  }

  // 检测是否是首次启动
  Future<bool> _checkFirstLaunch() async {
    final prefs = await SharedPreferences.getInstance();
    // 读取标记,默认值为true(首次启动)
    bool isFirstLaunch = prefs.getBool('is_first_launch') ?? true;
    
    // 如果是首次启动,标记为非首次(若需用户看完教程再标记,把这段移到教程完成按钮的点击事件中)
    if (isFirstLaunch) {
      await prefs.setBool('is_first_launch', false);
    }
    
    return isFirstLaunch;
  }
}

// 示例引导教程页面
class TutorialScreen extends StatelessWidget {
  const TutorialScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('引导教程')),
      body: Center(
        child: ElevatedButton(
          child: const Text('完成教程'),
          onPressed: () {
            Navigator.pushReplacement(
              context,
              MaterialPageRoute(builder: (context) => const HomeScreen()),
            );
          },
        ),
      ),
    );
  }
}

// 示例主页面
class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('主页面')),
      body: const Center(child: Text('欢迎回来!')),
    );
  }
}

注意事项

  • 如果需要用户看完引导教程再标记为非首次启动,请把prefs.setBool('is_first_launch', false)的代码移到教程最后一页的确认按钮点击事件中,而不是在检测函数里直接设置。
  • shared_preferences存储的数据会一直保留,除非用户卸载应用或者清除应用数据,完全符合"仅首次打开显示教程"的需求逻辑。

内容的提问来源于stack exchange,提问作者theProCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:46:12