Flutter引导页插件flutter_intro的使用

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

Flutter引导页插件flutter_intro的使用

简介

flutter_intro 是一个用于新功能介绍和用户引导的Flutter插件,它能够为您的Flutter项目提供更好的新特性介绍和分步用户指南。查看pub.dev上的最新版本

Simple intro demo Screen rotate intro demo Advanced, customized intro demo Multiple groups demo

功能特性

  • 适应设备方向:引导小部件能够根据设备方向自动调整。
  • 自定义渲染:支持自定义引导小部件的覆盖内容。
  • 分组展示:支持将引导页面分组,在单个页面上显示多个引导组。
  • 延迟渲染:支持带有延迟的引导小部件。

使用方法

初始化

在项目的根组件中添加 Intro 组件,并设置一些全局属性:

import 'package:flutter_intro/flutter_intro.dart';

Intro(
  padding: const EdgeInsets.all(8),
  borderRadius: BorderRadius.all(Radius.circular(4)),
  maskColor: const Color.fromRGBO(0, 0, 0, .6),
  noAnimation: false,
  maskClosable: false,
  buttonBuilder: (order) {
    return IntroButtonConfig(
      text: order == 3 ? 'Custom Button Text' : 'Next',
      height: order == 3 ? 48 : null,
      fontSize: order == 3 ? 24 : null,
      style: order == 3
        ? OutlinedButton.styleFrom(
            backgroundColor: Colors.red,
          )
        : null,
    );
  },
  child: const YourApp(),
)

添加引导小部件

使用 IntroStepBuilder 包裹需要引导的小部件,并设置 keyorder 属性:

IntroStepBuilder(
  order: 1,
  text: 'Use this widget to...',
  builder: (BuildContext context, GlobalKey key) => NeedGuideWidget(
    key: key,
  ),
)

运行引导

调用 Intro.of(context).start() 方法启动引导:

Intro.of(context).start();

高级用法

通过 overlayBuilder 创建自定义的引导覆盖层:

IntroStepBuilder(
  order: 2,
  overlayBuilder: (StepWidgetParams params) {
    return YourCustomOverlay();
  },
)

示例代码

下面是一个完整的示例代码,展示了如何使用 flutter_intro 插件:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const StartPage(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter Intro'),
      ),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (BuildContext context) => Intro(
                      padding: EdgeInsets.zero,
                      borderRadius: const BorderRadius.all(Radius.circular(4)),
                      maskColor: const Color.fromRGBO(0, 0, 0, .6),
                      child: const DemoUsage(),
                    ),
                  ),
                );
              },
              child: const Text('Demo'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (BuildContext context) => Intro(
                      buttonBuilder: (order) {
                        return IntroButtonConfig(
                          text: order == 3 ? 'Custom Button Text' : 'Next',
                          height: order == 3 ? 48 : null,
                          fontSize: order == 3 ? 24 : null,
                          style: order == 3
                              ? OutlinedButton.styleFrom(
                                  backgroundColor: Colors.red,
                                )
                              : null,
                        );
                      },
                      child: const SimpleUsage(),
                    ),
                  ),
                );
              },
              child: const Text('Simple Usage'),
            ),
            ElevatedButton(
              child: const Text('Advanced Usage'),
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (BuildContext context) => Intro(
                      child: const AdvancedUsage(),
                    ),
                  ),
                );
              },
            ),
            ElevatedButton(
              child: const Text('Group Usage'),
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (BuildContext context) => Intro(
                      child: const GroupUsage(),
                    ),
                  ),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

常见问题解答

Q1. 如果高亮区域没有完全显示?

A1. 默认情况下,Intro 提供了8px的内边距。可以通过设置 padding 来调整高亮区域的大小。

Q2. 是否可以为每个步骤设置不同的配置?

A2. 是的,可以在每个 IntroStepBuilder 中配置不同的参数。

Q3. 是否可以让高亮区域更小?

A3. 是的,可以通过设置 padding 为负值来缩小高亮区域。

Q4. 用户按下返回键时发生异常怎么办?

A4. 可以在 WillPopScope 中调用 intro.dispose() 方法来避免异常。

Q5. WillPopScope 已被弃用,有更好的解决方案吗?

A5. 可以使用 ValueNotifier<IntroStatus> 来监听引导状态并处理返回操作。

希望这些信息能帮助您更好地理解和使用 flutter_intro 插件!


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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_intro插件来实现引导页的一个简单示例。这个插件允许你创建一系列滑动页面来引导用户了解你的应用。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_intro: ^2.2.3  # 请确保版本号是最新的

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

接下来,我们编写一些Flutter代码来展示如何使用flutter_intro

1. 创建引导页内容

首先,我们创建一个简单的Widget来表示每个引导页的内容。这里我们用一个简单的CenterText来展示。

import 'package:flutter/material.dart';

class IntroPage extends StatelessWidget {
  final String title;
  final String description;

  IntroPage({required this.title, required this.description});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              title,
              style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 16),
            Text(
              description,
              style: TextStyle(fontSize: 18),
              textAlign: TextAlign.center,
            ),
          ],
        ),
      ),
    );
  }
}

2. 使用FlutterIntroSlider

然后,我们在主页面中使用FlutterIntroSlider来显示这些引导页。

import 'package:flutter/material.dart';
import 'package:flutter_intro/flutter_intro.dart';
import 'intro_page.dart';  // 假设你将上面的IntroPage类放在了这个文件中

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: IntroScreen(),
    );
  }
}

class IntroScreen extends StatefulWidget {
  @override
  _IntroScreenState createState() => _IntroScreenState();
}

class _IntroScreenState extends State<IntroScreen> {
  late final List<IntroPageModel> introPages;

  @override
  void initState() {
    super.initState();
    introPages = [
      IntroPageModel(
        title: "Welcome!",
        description: "This is the first slide of the introduction.",
        imagePath: "assets/images/slide1.png",  // 如果有图片,可以添加路径
        bgColor: Colors.blue,
        dotColor: Colors.white,
        activeDotColor: Colors.blue,
      ),
      IntroPageModel(
        title: "Get Started",
        description: "This is the second slide of the introduction.",
        imagePath: "assets/images/slide2.png",  // 如果有图片,可以添加路径
        bgColor: Colors.green,
        dotColor: Colors.white,
        activeDotColor: Colors.green,
      ),
      // 添加更多引导页...
    ];
  }

  @override
  Widget build(BuildContext context) {
    return FlutterIntroSlider(
      .introPages,
      onDonePress: () {
        // 完成引导页后的操作,比如跳转到主页面
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (context) => HomeScreen()),
        );
      },
      onSkipPress: () {
        // 跳过引导页后的操作
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (context) => HomeScreen()),
        );
      },
      showSkipButton: true,
      renderDoneButton: (context, onDonePress) {
        return ElevatedButton(
          onPressed: onDonePress,
          child: Text("Get Started"),
        );
      },
      renderSkipButton: (context, onSkipPress) {
        return TextButton(
          onPressed: onSkipPress,
          child: Text("Skip"),
        );
      },
      dotsDecorator: DotsDecorator(
        size: const Size(10.0, 10.0),
        activeSize: const Size(20.0, 10.0),
        color: Colors.grey,
        activeColor: Colors.white,
        spacing: const EdgeInsets.symmetric(horizontal: 5.0),
        activeShape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(12.5),
        ),
      ),
    );
  }
}

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!"),
      ),
    );
  }
}

在这个示例中,我们创建了一个IntroPageModel列表来表示每个引导页的数据,并使用FlutterIntroSlider来展示这些页面。你可以根据需求自定义每个页面的内容、背景颜色、点指示器的样式等。

确保你有适当的图片资源放在assets/images/目录下,并在pubspec.yaml中声明这些资源。

这个示例提供了一个基本的框架,你可以根据需要进一步自定义和扩展。

回到顶部