Flutter新用户引导插件app_onboarding的使用

Flutter新用户引导插件app_onboarding的使用

A Flutter包用于构建带有提示的新用户引导!

示例截图

示例如何使用该插件

特性

使用此插件在您的Flutter应用中可以实现:

  • 构建手动新用户引导
  • 构建自动新用户引导

开始使用

在您的pubspec.yaml文件中添加以下依赖项:

dependencies:
  app_onboarding: ^1.0.3

然后运行 flutter pub get 来安装。

使用方法

第一步:创建AppOnboardingController

在你的类中创建一个AppOnboardingController实例,并确保在dispose方法中释放资源:

late final AppOnboardingController controller = AppOnboardingController();

[@override](/user/override)
void dispose() {
  controller.dispose();
  super.dispose();
}

第二步:用AppOnboarding包装顶层屏幕组件并设置控制器

将你的顶层屏幕组件包裹在AppOnboarding中,并设置之前创建的controller

AppOnboarding(
  controller: controller,
  child: Scaffold(
    body: ...,
  ),
);

第三步:将需要引导的组件包裹在AppOnboardingEntry中

将你希望引导的组件(如按钮、文本等)包裹在AppOnboardingEntry中,并指定索引和其他配置:

AppOnboardingEntry(
  index: 0,
  tooltipSettings: TooltipSettings(backgroundColor: Colors.red.shade400),
  child: Text(widget.title),
),

第四步:启动引导流程

initState方法中,延迟一段时间后开始引导流程:

[@override](/user/override)
void initState() {
  super.initState();
  Future.delayed(
    const Duration(seconds: 2),
    controller.start,
  );
}

这样,你就创建了一个基本的新用户引导流程!

完整示例代码

以下是完整的示例代码,展示了如何使用app_onboarding插件:

import 'package:app_onboarding/app_onboarding.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late final AppOnboardingController controller = AppOnboardingController();

  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    Future.delayed(
      const Duration(seconds: 2),
      controller.start,
    );
  }

  [@override](/user/override)
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final buttonStyle = Theme.of(context).elevatedButtonTheme.style ?? const ButtonStyle();
    return AppOnboarding(
      controller: controller,
      onDone: () => showDialog(
        context: context,
        builder: (BuildContext context) => const AlertDialog(
          title: Text(
            'Onboarding finished!\n(onDone)',
            textAlign: TextAlign.center,
          ),
        ),
      ),
      onStart: () => showDialog(
        context: context,
        builder: (BuildContext context) => const AlertDialog(
          title: Text(
            'Onboarding started!\n(onStart)',
            textAlign: TextAlign.center,
          ),
        ),
      ),
      onAutoHiddenDone: () => showDialog(
        context: context,
        builder: (BuildContext context) => const AlertDialog(
          title: Text(
            'Auto Onboarding done!\n(onAutoHiddenDone)',
            textAlign: TextAlign.center,
          ),
        ),
      ),
      onAutoHiddenStart: () => showDialog(
        context: context,
        builder: (BuildContext context) => const AlertDialog(
          title: Text(
            'Auto Onboarding started!\n(onAutoHiddenStart)',
            textAlign: TextAlign.center,
          ),
        ),
      ),
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Theme.of(context).colorScheme.inversePrimary,
          title: AppOnboardingEntry(
            index: 0,
            tooltipSettings: TooltipSettings(backgroundColor: Colors.red.shade400),
            child: Text(widget.title),
          ),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              AppOnboardingEntry(
                index: 2,
                customTooltipBuilder: (context, index) {
                  return SizedBox(
                    height: 150,
                    child: DecoratedBox(
                      decoration: BoxDecoration(
                        color: Colors.red.shade400,
                        borderRadius: BorderRadius.circular(20),
                      ),
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                          const Text(
                            'Custom tooltip!',
                            textAlign: TextAlign.center,
                          ),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              ElevatedButton(
                                onPressed: () {
                                  controller.showPrev();
                                },
                                child: const Text('Prev'),
                              ),
                              ElevatedButton(
                                onPressed: controller.hide,
                                child: const Text('Skip'),
                              ),
                              ElevatedButton(
                                onPressed: () {
                                  controller.showNext();
                                },
                                child: const Text('Next'),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                  );
                },
                tooltipSettings: const TooltipSettings(
                  tooltipDirection: AppOnboardingTooltipDirection.bottom,
                ),
                child: const Text(
                  'You have pushed the button this many times:',
                ),
              ),
              AppOnboardingEntry(
                index: 1,
                tooltipSettings: TooltipSettings(
                  tooltipTextSettings: TooltipTextSettings(
                    text: 'Custom text',
                    textStyle: Theme.of(context).textTheme.titleLarge?.copyWith(color: Colors.yellow),
                    textAlign: TextAlign.center,
                  ),
                  backgroundColor: Colors.red.shade300,
                  skipButtonSettings: ButtonSettings(
                    buttonStyle: buttonStyle.copyWith(
                      backgroundColor: WidgetStatePropertyAll<Color>(
                        Colors.blue.shade500,
                      ),
                      foregroundColor: WidgetStatePropertyAll(Colors.white),
                    ),
                  ),
                  nextButtonSettings: ButtonSettings(
                    buttonStyle: buttonStyle.copyWith(
                      backgroundColor: WidgetStatePropertyAll<Color>(
                        Colors.pink.shade400,
                      ),
                    ),
                  ),
                ),
                child: Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headlineMedium,
                ),
              ),
              const SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  controller.start();
                },
                child: const Text('Start Onboarding'),
              ),
              const SizedBox(height: 20),
              AppOnboardingEntry(
                index: 5,
                isAutoHidden: true,
                tooltipOffset: Offset(0, 10),
                tooltipSettings: TooltipSettings(
                  tooltipTextSettings: TooltipTextSettings(
                    text: 'SECOND AUTO TOOLTIP!',
                    textAlign: TextAlign.center,
                  ),
                ),
                child: ElevatedButton(
                  onPressed: () {
                    controller.startAutoHidden();
                  },
                  child: const Text('Start Auto onboarding'),
                ),
              ),
            ],
          ),
        ),
        floatingActionButton: AppOnboardingEntry(
          index: 3,
          tooltipOffset: const Offset(-113, -20),
          tooltipSettings: const TooltipSettings(
            arrowPosition: AppOnboardingTooltipArrowPosition.right,
            tooltipDirection: AppOnboardingTooltipDirection.bottom,
            completeText: 'Complete!',
          ),
          holeBorderRadius: 100,
          holeInnerPadding: 12,
          backgroundColor: Colors.blue.withOpacity(0.4),
          customOverlayBuilder: (context, index) {
            return Center(
              child: ColoredBox(
                color: Colors.red.shade300,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    const Text('Custom Background!'),
                    const FlutterLogo(
                      size: 150,
                    ),
                    ElevatedButton(
                      onPressed: () {
                        showModalBottomSheet(
                          context: context,
                          builder: (context) {
                            return Container(
                              height: 200,
                              width: double.infinity,
                              color: Colors.red.shade200,
                              child: const Column(
                                children: [
                                  SizedBox(height: 50),
                                  Text('You can do all!'),
                                  SizedBox(height: 50),
                                ],
                              ),
                            );
                          },
                        );
                      },
                      child: const Text(
                        'Click me',
                      ),
                    ),
                  ],
                ),
              ),
            );
          },
          child: AppOnboardingEntry(
            index: 4,
            isAutoHidden: true,
            tooltipOffset: const Offset(-113, -15),
            tooltipSettings: const TooltipSettings(
              tooltipTextSettings:
                  TooltipTextSettings(text: 'THIS IS AUTO TOOLTIP!'),
              tooltipDirection: AppOnboardingTooltipDirection.bottom,
              arrowPosition: AppOnboardingTooltipArrowPosition.right,
            ),
            child: FloatingActionButton(
              onPressed: _incrementCounter,
              tooltip: 'Increment',
              child: const Icon(Icons.add),
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter新用户引导插件app_onboarding的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter新用户引导插件app_onboarding的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,作为IT专家,以下是如何在Flutter项目中集成和使用app_onboarding插件来进行新用户引导的一个代码示例。app_onboarding是一个流行的Flutter插件,用于创建引人入胜的用户引导界面。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加app_onboarding依赖:

dependencies:
  flutter:
    sdk: flutter
  app_onboarding: ^1.2.0  # 请注意版本号,确保使用最新版本

然后运行flutter pub get来安装依赖。

步骤 2: 导入包

在你的Dart文件中导入app_onboarding包:

import 'package:flutter/material.dart';
import 'package:app_onboarding/app_onboarding.dart';

步骤 3: 创建引导页面

定义你的引导页面内容。例如,你可以有三个引导页面,每个页面都有不同的图片和标题。

List<Map<String, dynamic>> pages = [
  {
    'title': 'Welcome!',
    'description': 'This is the first slide of the onboarding process.',
    'image': AssetImage('assets/images/onboarding_1.png'),
  },
  {
    'title': 'Get Started',
    'description': 'This is the second slide. Learn how to get started.',
    'image': AssetImage('assets/images/onboarding_2.png'),
  },
  {
    'title': 'Enjoy!',
    'description': 'This is the last slide. Enjoy using our app!',
    'image': AssetImage('assets/images/onboarding_3.png'),
  },
];

确保你已经将引导页面图片添加到了assets文件夹中,并在pubspec.yaml中声明它们:

flutter:
  assets:
    - assets/images/onboarding_1.png
    - assets/images/onboarding_2.png
    - assets/images/onboarding_3.png

步骤 4: 构建引导页面

使用Onboarding小部件来构建你的引导页面:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Onboarding(
        pages: pages.map((page) {
          return OnboardingPage(
            title: Text(page['title']!),
            description: Text(page['description']!),
            image: Image(image: page['image'] as AssetImage),
            // 可以添加更多自定义内容,如背景颜色、按钮等
          );
        }).toList(),
        // 完成引导后的操作
        onComplete: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => HomeScreen()),
          );
        },
        // 引导过程中的跳过按钮(可选)
        onSkip: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => HomeScreen()),
          );
        },
        // 引导页面底部的圆点指示器(可选)
        dotsIndicatorColor: Colors.white,
        activeDotColor: Colors.blue,
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home Screen')),
      body: Center(child: Text('Welcome to the Home Screen!')),
    );
  }
}

解释

  • Onboarding小部件接受一个pages列表,每个页面都是一个OnboardingPage对象。
  • 每个OnboardingPage对象包含标题、描述和图片。
  • onComplete回调是在用户完成所有引导页面后触发的。
  • onSkip回调是在用户点击跳过按钮时触发的。
  • dotsIndicatorColoractiveDotColor用于自定义底部圆点指示器的颜色。

这样,你就成功地在Flutter应用中集成了app_onboarding插件,并创建了新用户引导界面。希望这个示例对你有所帮助!

回到顶部