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

Flutter 如何实现应用首次启动时展示新手引导功能

Flutter 应用首次启动引导流程实现方案

核心逻辑

整个功能分为两个核心模块:

  • 本地持久化存储引导完成状态,每次启动优先读取该状态判断是否需要展示引导
  • 引导页步骤切换交互,用户完成全部引导或主动跳过后,更新存储状态

1. 引入持久化存储依赖

使用官方维护的shared_preferences库实现状态持久化,首先在pubspec.yaml中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.2.2

执行flutter pub get完成依赖安装。

2. 启动时路由判断

在应用初始化阶段读取存储的引导完成状态,直接决定初始路由:

void main() async {
  // 确保初始化完成再执行异步操作
  WidgetsFlutterBinding.ensureInitialized();
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  // 读取状态,未查到值时默认是未完成引导
  final bool hasCompletedGuide = prefs.getBool('hasCompletedGuide') ?? false;
  runApp(
    MaterialApp(
      initialRoute: hasCompletedGuide ? '/home' : '/guide',
      routes: {
        '/home': (context) => const HomePage(),
        '/guide': (context) => const GuidePage(),
      },
    )
  );
}

3. 引导页实现

引导页使用PageView组件实现多步骤切换,底部配置下一步、完成、跳过按钮:

class GuidePage extends StatefulWidget {
  const GuidePage({super.key});

  @override
  State<GuidePage> createState() => _GuidePageState();
}

class _GuidePageState extends State<GuidePage> {
  final PageController _pageController = PageController();
  // 引导页总页数
  final int _totalPage = 3;
  int _currentPage = 0;

  // 标记引导完成,跳转首页
  void _completeGuide() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setBool('hasCompletedGuide', true);
    if (mounted) {
      Navigator.pushReplacementNamed(context, '/home');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView(
        controller: _pageController,
        onPageChanged: (index) => setState(() => _currentPage = index),
        children: const [
          // 替换为你自己的引导页内容组件
          GuideItem(title: "功能1", desc: "功能1介绍"),
          GuideItem(title: "功能2", desc: "功能2介绍"),
          GuideItem(title: "功能3", desc: "功能3介绍"),
        ],
      ),
      bottomNavigationBar: Padding(
        padding: const EdgeInsets.all(16),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            // 跳过按钮,非最后一步显示
            if (_currentPage != _totalPage -1)
              TextButton(onPressed: _completeGuide, child: const Text("跳过")),
            // 页码指示器
            Row(
              children: List.generate(_totalPage, (index) => Container(
                margin: const EdgeInsets.symmetric(horizontal: 4),
                width: _currentPage == index ? 20 : 8,
                height: 8,
                decoration: BoxDecoration(
                  color: _currentPage == index ? Colors.blue : Colors.grey,
                  borderRadius: BorderRadius.circular(4)
                ),
              )),
            ),
            // 下一步/完成按钮
            TextButton(
              onPressed: () {
                if (_currentPage == _totalPage -1) {
                  _completeGuide();
                } else {
                  _pageController.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.ease);
                }
              },
              child: Text(_currentPage == _totalPage -1 ? "完成" : "下一步"),
            )
          ],
        ),
      ),
    );
  }
}

可选优化点

  • 若应用大版本更新后需要重新展示引导,可将存储key加上版本号,例如hasCompletedGuide_v2,版本迭代后修改key即可重新触发引导
  • 可给PageView添加自定义切换动画,优化引导页过渡体验
  • 引导页内容支持图片、视频等富媒体展示,按需调整GuideItem组件即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:45:06