Flutter如何检测用户首次打开应用,仅展示一次引导教程?
实现Flutter应用首次打开仅显示引导教程的方案
核心思路是用本地持久化存储记录用户是否已经打开过应用,这里推荐使用shared_preferences包(轻量、适合存储简单键值对),通过一个布尔值标记用户是否是首次启动,以此决定是否展示引导教程。
具体实现步骤
- 添加依赖
在项目的pubspec.yaml文件中添加shared_preferences依赖:
dependencies: flutter: sdk: flutter shared_preferences: ^2.2.2 # 版本号以最新官方为准
执行flutter pub get安装依赖。
- 编写检测与展示逻辑
可以在应用启动入口或首页的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
相关产品推荐
相关产品推荐

