Flutter引导教程插件app_tutorial的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter引导教程插件app_tutorial的使用

Flutter App Onboarding 插件app_tutorial提供了一种简单且灵活的方法来为您的应用程序创建引导教程。这可以帮助用户快速了解应用的主要功能和界面元素。下面将详细介绍如何使用这个插件,包括其主要属性和方法,并给出一个完整的示例demo。

使用方法

1. 添加依赖

首先,在项目的pubspec.yaml文件中添加app_tutorial包作为依赖:

dependencies:
  app_tutorial: ^currentVersion

请确保替换currentVersion为您想使用的具体版本号。

2. 导入库

在Dart代码中导入app_tutorial库:

import 'package:app_tutorial/app_tutorial.dart';

3. 创建引导教程项

每个教程项由TutorialItem类表示,它包含以下属性:

  • globalKey: 组件的全局键(必填),用于确定要聚焦的组件。
  • child: 当前项目激活时显示的Widget(必填)。
  • color: 覆盖层的颜色(可选,默认为黑色半透明)。
  • borderRadius: 高亮元素边框的圆角大小(可选,默认为10.0)。
  • radius: 如果形状是椭圆形,则为其设置半径(可选)。
  • shapeFocus: 焦点元素的形状(可选,默认为带有圆角的正方形)。

例如,可以创建如下的教程项:

List<TutorialItem> items = [
  TutorialItem(
    globalKey: incrementKey,
    color: Colors.black.withOpacity(0.6),
    borderRadius: const Radius.circular(15.0),
    shapeFocus: ShapeFocus.roundedSquare,
    child: const TutorialItemContent(
      title: 'Increment button',
      content: 'This is the increment button',
    ),
  ),
  // ...其他教程项...
];

4. 显示引导教程

通过调用Tutorial.showTutorial()方法来启动引导教程,该方法接受三个参数:当前上下文、教程项列表以及完成后的回调函数。

Tutorial.showTutorial(context, items, onTutorialComplete: () {
  print('Tutorial is complete!');
});

此外,还可以调用Tutorial.skipAll()跳过所有教程步骤。

完整示例Demo

下面是基于上述说明构建的一个完整示例,展示了如何在一个简单的计数器应用中实现引导教程功能。

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App Tutorial Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'App Tutorial Demo'),
    );
  }
}

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

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  List<TutorialItem> items = [];

  final incrementKey = GlobalKey();
  final avatarKey = GlobalKey();
  final textKey = GlobalKey();

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

  void initItems() {
    items.addAll([
      TutorialItem(
        globalKey: incrementKey,
        color: Colors.black.withOpacity(0.6),
        borderRadius: const Radius.circular(15.0),
        shapeFocus: ShapeFocus.roundedSquare,
        child: const TutorialItemContent(
          title: 'Increment button',
          content: 'This is the increment button',
        ),
      ),
      TutorialItem(
        globalKey: textKey,
        shapeFocus: ShapeFocus.square,
        borderRadius: const Radius.circular(15.0),
        child: const TutorialItemContent(
          title: 'Counter text',
          content: 'This is the text that displays the status of the counter',
        ),
      ),
      TutorialItem(
        globalKey: avatarKey,
        color: Colors.black.withOpacity(0.6),
        shapeFocus: ShapeFocus.oval,
        child: const TutorialItemContent(
          title: 'Avatar',
          content: 'This is the avatar that displays something',
        ),
      ),
    ]);
  }

  @override
  void initState() {
    initItems();
    Future.delayed(const Duration(milliseconds: 200)).then((value) {
      Tutorial.showTutorial(context, items, onTutorialComplete: () {
        print('Tutorial is complete!');
      });
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
        leading: Icon(
          Icons.add_circle_outline_rounded,
          key: avatarKey,
        ),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              key: textKey,
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        key: incrementKey,
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class TutorialItemContent extends StatelessWidget {
  const TutorialItemContent({
    super.key,
    required this.title,
    required this.content,
  });

  final String title;
  final String content;

  @override
  Widget build(BuildContext context) {
    final width = MediaQuery.of(context).size.width;

    return Center(
      child: SizedBox(
        height: MediaQuery.of(context).size.height * 0.6,
        child: Padding(
          padding: EdgeInsets.symmetric(horizontal: width * 0.1),
          child: Column(
            children: [
              Text(
                title,
                style: const TextStyle(color: Colors.white),
              ),
              const SizedBox(height: 10.0),
              Text(
                content,
                textAlign: TextAlign.center,
                style: const TextStyle(color: Colors.white),
              ),
              const Spacer(),
              Row(
                children: [
                  TextButton(
                    onPressed: () => Tutorial.skipAll(context),
                    child: const Text(
                      'Skip onboarding',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                  const Spacer(),
                  const TextButton(
                    onPressed: null,
                    child: Text(
                      'Next',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}

此示例演示了如何在应用程序启动时自动开始引导教程,并针对不同的UI组件设置了相应的教程提示信息。希望这些内容对您有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用app_tutorial插件来创建引导教程的示例代码。app_tutorial插件可以帮助你轻松地在应用中添加引导教程页面。

首先,确保你已经在pubspec.yaml文件中添加了app_tutorial依赖:

dependencies:
  flutter:
    sdk: flutter
  app_tutorial: ^latest_version  # 请替换为最新版本号

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

接下来,让我们创建一个简单的Flutter应用,并添加引导教程功能。

1. 创建Flutter项目

如果你还没有创建Flutter项目,可以使用以下命令创建一个新项目:

flutter create my_app_tutorial
cd my_app_tutorial

2. 配置引导教程

打开lib/main.dart文件,并添加以下代码来配置引导教程:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter App Tutorial',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TutorialHome(),
    );
  }
}

class TutorialHome extends StatefulWidget {
  @override
  _TutorialHomeState createState() => _TutorialHomeState();
}

class _TutorialHomeState extends State<TutorialHome> {
  final List<TutorialStep> tutorialSteps = [
    TutorialStep(
      title: 'Step 1',
      description: 'This is the first step of the tutorial.',
      page: Scaffold(
        appBar: AppBar(
          title: Text('First Step'),
        ),
        body: Center(
          child: Text('Welcome to the first step!'),
        ),
      ),
      shape: Shape.circle(50),
      position: Position.bottom,
      color: Colors.blue,
      image: Image.asset('assets/images/step1.png'),  // 替换为你的图片路径
    ),
    TutorialStep(
      title: 'Step 2',
      description: 'This is the second step of the tutorial.',
      page: Scaffold(
        appBar: AppBar(
          title: Text('Second Step'),
        ),
        body: Center(
          child: Text('Welcome to the second step!'),
        ),
      ),
      shape: Shape.circle(50),
      position: Position.bottom,
      color: Colors.green,
      image: Image.asset('assets/images/step2.png'),  // 替换为你的图片路径
    ),
    // 可以添加更多步骤
  ];

  bool isTutorialCompleted = false;

  @override
  Widget build(BuildContext context) {
    return !isTutorialCompleted
        ? TutorialScreen(
            tutorialSteps: tutorialSteps,
            onFinish: () {
              setState(() {
                isTutorialCompleted = true;
              });
            },
            skip: () {
              setState(() {
                isTutorialCompleted = true;
              });
            },
            next: () {
              // 自定义下一步按钮点击事件
            },
            dotIndicatorCount: tutorialSteps.length,
            dotColor: Colors.grey,
            dotActiveColor: Colors.blue,
            activeDotBackgroundColor: Colors.white,
            activeDotBorderColor: Colors.blue,
            showSkipButton: true,
            showNextButton: true,
            nextButtonText: 'Next',
            skipButtonText: 'Skip',
            doneButtonText: 'Done',
            tutorialBackgroundColor: Colors.white,
            tutorialElevation: 8.0,
            dotContainerPadding: EdgeInsets.all(16.0),
            dotIndicatorPadding: EdgeInsets.symmetric(horizontal: 16.0),
            tutorialPadding: EdgeInsets.all(16.0),
            customSkipIcon: Icon(Icons.close),
            customNextIcon: Icon(Icons.arrow_forward),
            customDoneIcon: Icon(Icons.done),
          )
        : MyHomePage();
  }
}

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

3. 添加图片资源

确保你在assets文件夹中添加了步骤图片(例如step1.pngstep2.png),并在pubspec.yaml文件中声明它们:

flutter:
  assets:
    - assets/images/step1.png
    - assets/images/step2.png

4. 运行应用

现在,你可以运行你的Flutter应用,并查看引导教程。

flutter run

这个示例展示了如何使用app_tutorial插件来创建一个包含两个步骤的引导教程。你可以根据需要添加更多步骤,并自定义每个步骤的标题、描述、页面内容和外观。

回到顶部