Flutter引导页插件introduction_story的使用

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

Flutter引导页插件introduction_story的使用

插件介绍

introduction_story 是一个受社交媒体故事启发的屏幕,可以用来作为新用户引导或功能介绍。以下是该插件的一个示例动画:

example.gif

开始使用

  1. pubspec.yaml 文件中添加 introduction_story 依赖:
dependencies:
  introduction_story: ^0.1.0

使用方法

  1. 在你的 Dart 文件中添加以下导入语句:
import 'package:flutter/material.dart';
import 'package:introduction_story/introduction_story.dart';
  1. 声明引导页面应该是什么样子,并通过 Navigator 推送该页面:
Navigator.push(
      context,
      MaterialPageRoute(
        builder: (_) {
          return IntroductionStoryScreen(
            stories: [
              Story(
                imagePath: 'assets/image_1.png', // 图片路径
                featureName: 'Here you can write the story name', // 故事名称
                title: 'Here you can write the title', // 标题
                description: 'Here you can write the description', // 描述
              ),
              Story(
                imagePath: 'assets/image_2.png',
                featureName: 'Here you can write the story name',
                title: 'Here you can write the title',
                description: 'Here you can write the description',
              ),
            ],
          );
        },
      ),
    );

文档说明

Story 类
Dart 属性 数据类型 描述 默认值
name String 故事名称 空字符串
title String 故事标题 空字符串
description String 故事描述 空字符串
imagePath String 故事背景图片路径 Null
decoration StoryDecoration 故事自定义设置(例如前景色、文本样式) StoryDecoration()
StoryDecoration 类
Dart 属性 数据类型 描述 默认值
lightMode bool 指定故事亮度模式(亮/暗),应用于状态栏图标(仅限 iOS)和所有前景组件颜色 True
foregroundColor Color 设置前景部件颜色 Null
backgroundColor Color 故事背景颜色 Null
titleTextStyle TextStyle 设置标题文本样式 Null
descriptionTextStyle TextStyle 设置描述文本样式 Null
nameTextStyle TextStyle 设置名称文本样式 Null

完整示例代码

以下是一个完整的示例,展示如何在应用程序中使用 introduction_story 插件:

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:introduction_story/introduction_story.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Introduction Story',
      theme: ThemeData.dark(),
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Story Introduction'),
      ),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Padding(
              padding: const EdgeInsets.all(14),
              child: Text.rich(
                TextSpan(
                  text:
                      '我们假设这是新提供的功能的简要说明。请查看下面的CTA。\n',
                  children: [
                    TextSpan(
                      text: '点击以获取关于 $_featureName 的更多信息。 🍇',
                      style: const TextStyle(
                        decoration: TextDecoration.underline,
                        color: Colors.lightBlueAccent,
                      ),
                      recognizer: TapGestureRecognizer()
                        ..onTap = () => _pushIntroductionStoriesScreen(context),
                    )
                  ],
                ),
              ),
            ),
            Expanded(
              child: ListView.separated(
                padding: const EdgeInsets.all(12),
                separatorBuilder: (_, __) => const SizedBox(height: 12),
                itemBuilder: (BuildContext context, int index) {
                  return Container(
                    height: 200,
                    decoration: BoxDecoration(
                      color: Colors.grey[200]?.withOpacity(.1),
                      borderRadius: BorderRadius.circular(20),
                      image: const DecorationImage(
                        image: AssetImage('assets/placeholder.png'),
                      ),
                    ),
                  );
                },
                itemCount: 5,
              ),
            ),
          ],
        ),
      ),
    );
  }

  String get _featureName => 'Grocery Store'; // 功能名称

  void _pushIntroductionStoriesScreen(BuildContext context) {
    Navigator.push<void>(
      context,
      PageRouteBuilder(
        opaque: false,
        pageBuilder: (_, __, ___) => IntroductionStoryScreen(
          isDismissible: true,
          stories: [
            Story(
              imagePath: 'assets/image_1.png', // 图片路径
              name: _featureName, // 故事名称
              title: '在线杂货购物', // 标题
              description:
                  '购买您喜欢的杂货以及即食产品,由新鲜食材制成,每天为您准备。', // 描述
            ),
            Story(
              imagePath: 'assets/image_2.png',
              title: '我们的目标是优质品质',
              name: _featureName,
              description:
                  '类别:新鲜水果、蔬菜和草药、面包和糕点、奶酪、乳制品和熟食、甜点和糖果。',
              decoration: const StoryDecoration(lightMode: false), // 自定义装饰
            ),
            Story(
              imagePath: 'assets/image_3.png',
              title: '我们快速送货上门',
              name: _featureName,
              description:
                  '您的美食杂货只需点击一下即可!选择您喜欢的杂货并在15分钟内收到您的订单。',
              decoration: const StoryDecoration(lightMode: false), // 自定义装饰
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用introduction_story插件来创建引导页的示例代码。introduction_story是一个流行的Flutter插件,用于创建精美的引导页体验。

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

dependencies:
  flutter:
    sdk: flutter
  introduction_story: ^0.8.0  # 请检查最新版本号

然后,运行flutter pub get来获取依赖。

接下来,你可以在你的主文件中(通常是main.dart)使用IntroductionScreen组件来创建引导页。以下是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Introduction Story Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: IntroductionScreenPage(),
    );
  }
}

class IntroductionScreenPage extends StatefulWidget {
  @override
  _IntroductionScreenPageState createState() => _IntroductionScreenPageState();
}

class _IntroductionScreenPageState extends State<IntroductionScreenPage> {
  final List<PageViewModel> pages = [
    PageViewModel(
      title: "Welcome!",
      body: "This is the first page of the introduction.",
      image: Center(
        child: Image.asset('assets/images/page1.png'), // 请确保你有这个图片资源
      ),
      footer: Footer(
        skipButton: SkipButton(
          onPressed: () => Navigator.pushReplacementNamed(context, '/home'),
        ),
        nextButton: NextButton(),
      ),
    ),
    PageViewModel(
      title: "Features",
      body: "Discover our amazing features!",
      image: Center(
        child: Image.asset('assets/images/page2.png'), // 请确保你有这个图片资源
      ),
      footer: Footer(
        skipButton: SkipButton(
          onPressed: () => Navigator.pushReplacementNamed(context, '/home'),
        ),
        nextButton: NextButton(),
      ),
    ),
    PageViewModel(
      title: "Get Started",
      body: "Ready to get started?",
      image: Center(
        child: Image.asset('assets/images/page3.png'), // 请确保你有这个图片资源
      ),
      footer: Footer(
        skipButton: SkipButton(
          onPressed: () => Navigator.pushReplacementNamed(context, '/home'),
        ),
        doneButton: DoneButton(
          onPressed: () => Navigator.pushReplacementNamed(context, '/home'),
        ),
      ),
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return IntroductionScreen(
      pages: pages,
      onDone: () => Navigator.pushReplacementNamed(context, '/home'),
      onSkip: () => Navigator.pushReplacementNamed(context, '/home'),
      showSkipButton: true,
      skipFlex: 0,
      nextFlex: 0,
      doneFlex: 1,
      skip: const Text('Skip'),
      next: const Text('Next'),
      done: const Text('Done'),
      dotsDecorator: DotsDecorator(
        size: Size(10.0, 10.0),
        activeSize: Size(20.0, 10.0),
        activeColor: Colors.deepOrange,
        color: Colors.grey,
        spacing: 8.0,
      ),
    );
  }
}

在这个示例中,我们定义了一个包含三个引导页的列表pages,每个页面都有一个标题、正文、图片和页脚。页脚包含一个跳过按钮和一个下一步/完成按钮。

请确保你有assets/images/page1.pngassets/images/page2.pngassets/images/page3.png这些图片资源,或者你可以替换为你自己的图片资源。

此外,你需要在你的pubspec.yaml文件中声明这些图片资源:

flutter:
  assets:
    - assets/images/page1.png
    - assets/images/page2.png
    - assets/images/page3.png

这个示例展示了如何使用introduction_story插件创建一个简单的引导页流程。你可以根据需要进一步自定义和扩展它。

回到顶部