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

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

flutter_onboard 是一个用于Flutter应用的新用户引导插件,支持Android和iOS平台。它可以帮助开发者快速实现美观的新手引导页。

安装

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

dependencies:
  flutter_onboard: ^2.0.0

然后运行 flutter pub get 来安装该插件。

基本用法

首先,导入 flutter_onboard 包:

import 'package:flutter_onboard/flutter_onboard.dart';

接下来,在您的应用中使用 OnBoard 组件:

OnBoard(
    onBoardData: onBoardData,
    pageController: pageController,
    // Either Provide onSkip Callback or skipButton Widget to handle skip state
    onSkip: () {
      print('skipped');
    },
    // Either Provide onDone Callback or nextButton Widget to handle done state
    onDone: () {
      print('done tapped');
    },
)

OnBoardModel 示例

定义您的引导页面数据:

final List<OnBoardModel> onBoardData = [
  const OnBoardModel(
    title: "Set your own goals and get better",
    description: "Goal support your motivation and inspire you to work harder",
    imgUrl: "assets/images/weight.png",
  ),
  const OnBoardModel(
    title: "Track your progress with statistics",
    description: "Analyse personal result with detailed chart and numerical values",
    imgUrl: 'assets/images/graph.png',
  ),
  const OnBoardModel(
    title: "Create photo comparisons and share your results",
    description: "Take before and after photos to visualize progress and get the shape that you dream about",
    imgUrl: 'assets/images/phone.png',
  ),
];

自定义用法

您可以根据需要自定义 OnBoard 组件的各种属性。以下是部分可配置的属性列表:

属性 是否必需 描述
onBoardData [List<OnBoardModel>] 引导页的数据
onSkip [VoidCallback] 跳过操作的回调
onDone [VoidCallback] 完成操作的回调
titleStyles [TextStyles] 标题文本样式
descriptionStyles [TextStyles] 描述文本样式
imageWidth [double] 图片宽度
imageHeight [double] 图片高度
skipButton [Widget] 自定义跳过按钮
nextButton [Widget] 自定义下一步/完成按钮
pageController [PageController] PageView 控制器
duration [Duration] 页面切换动画时长
curve [Curve] 页面切换动画曲线
pageIndicatorStyle [PageIndicatorStyle] 页面指示器样式

自定义用法示例

下面是一个更复杂的自定义用法示例,其中使用了 provider 包来访问 OnBoardState

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

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

class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  final PageController _pageController = PageController();
  
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: OnBoard(
        pageController: _pageController,
        onSkip: () {
          // print('skipped');
        },
        onDone: () {
          // print('done tapped');
        },
        onBoardData: onBoardData,
        titleStyles: const TextStyle(
          color: Colors.deepOrange,
          fontSize: 18,
          fontWeight: FontWeight.w900,
          letterSpacing: 0.15,
        ),
        descriptionStyles: TextStyle(
          fontSize: 16,
          color: Colors.brown.shade300,
        ),
        pageIndicatorStyle: const PageIndicatorStyle(
          width: 100,
          inactiveColor: Colors.deepOrangeAccent,
          activeColor: Colors.deepOrange,
          inactiveSize: Size(8, 8),
          activeSize: Size(12, 12),
        ),
        skipButton: TextButton(
          onPressed: () {
            // print('skipButton pressed');
          },
          child: const Text(
            "Skip",
            style: TextStyle(color: Colors.deepOrangeAccent),
          ),
        ),
        nextButton: OnBoardConsumer(
          builder: (context, ref, child) {
            final state = ref.watch(onBoardStateProvider);
            return InkWell(
              onTap: () => _onNextTap(state),
              child: Container(
                width: 230,
                height: 50,
                alignment: Alignment.center,
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(30),
                  gradient: const LinearGradient(
                    colors: [Colors.redAccent, Colors.deepOrangeAccent],
                  ),
                ),
                child: Text(
                  state.isLastPage ? "Done" : "Next",
                  style: const TextStyle(
                    color: Colors.white,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
            );
          },
        ),
      ),
    );
  }

  void _onNextTap(OnBoardState onBoardState) {
    if (!onBoardState.isLastPage) {
      _pageController.animateToPage(
        onBoardState.page + 1,
        duration: const Duration(milliseconds: 250),
        curve: Curves.easeInOutSine,
      );
    } else {
      //print("nextButton pressed");
    }
  }
}

final List<OnBoardModel> onBoardData = [
  const OnBoardModel(
    title: "Set your own goals and get better",
    description: "Goal support your motivation and inspire you to work harder",
    imgUrl: "assets/images/weight.png",
  ),
  const OnBoardModel(
    title: "Track your progress with statistics",
    description: "Analyse personal result with detailed chart and numerical values",
    imgUrl: 'assets/images/graph.png',
  ),
  const OnBoardModel(
    title: "Create photo comparisons and share your results",
    description: "Take before and after photos to visualize progress and get the shape that you dream about",
    imgUrl: 'assets/images/phone.png',
  ),
];

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

1 回复

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


当然,flutter_onboard 是一个用于在 Flutter 应用中实现新用户引导(onboarding)屏幕的流行插件。下面是一个简单的代码示例,展示如何在 Flutter 应用中使用 flutter_onboard 插件来实现新用户引导屏幕。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_onboard: ^2.0.0  # 请检查最新版本号

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

接下来,在你的 Flutter 应用中创建一个新用户引导屏幕。以下是一个完整的示例代码:

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

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

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

class OnboardingScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Onboarding(
      pages: [
        OnboardingPage(
          title: "Welcome!",
          description: "This is the first screen of the onboarding process.",
          image: Image.asset("assets/images/onboarding_1.png"),  // 请确保你有这张图片资源
        ),
        OnboardingPage(
          title: "Get Started",
          description: "This is the second screen of the onboarding process.",
          image: Image.asset("assets/images/onboarding_2.png"),  // 请确保你有这张图片资源
        ),
        OnboardingPage(
          title: "Enjoy!",
          description: "This is the third screen of the onboarding process.",
          image: Image.asset("assets/images/onboarding_3.png"),  // 请确保你有这张图片资源
        ),
      ],
      dotsIndicatorColor: Colors.white,
      completeButton: TextButton(
        onPressed: () {
          // 完成引导后的逻辑,比如跳转到主屏幕
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => HomeScreen()),
          );
        },
        child: Text("Get Started"),
        style: ButtonStyle(
          backgroundColor: MaterialStateProperty.all(Colors.blue),
          foregroundColor: MaterialStateProperty.all(Colors.white),
          textStyle: MaterialStateProperty.all(
            TextStyle(fontSize: 18),
          ),
        ),
      ),
      skipButton: TextButton(
        onPressed: () {
          // 跳过引导后的逻辑,比如跳转到主屏幕
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => HomeScreen()),
          );
        },
        child: Text("Skip"),
        style: ButtonStyle(
          foregroundColor: MaterialStateProperty.all(Colors.white),
        ),
      ),
    );
  }
}

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

在这个示例中:

  1. Onboarding 小部件接受一个 pages 列表,每个页面都是一个 OnboardingPage 小部件。
  2. 每个 OnboardingPage 小部件包含标题、描述和一张图片。
  3. dotsIndicatorColor 用于设置底部指示器的颜色。
  4. completeButtonskipButton 分别定义了完成和跳过按钮的样式和行为。当用户点击这些按钮时,将导航到主屏幕 (HomeScreen)。

确保你已经在项目的 assets 文件夹中添加了相应的图片资源,并在 pubspec.yaml 文件中声明它们。例如:

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

这样,你就可以在 Flutter 应用中使用 flutter_onboard 插件来创建新用户引导屏幕了。

回到顶部