Flutter步骤指示器插件flutter_stepindicator的使用

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

Flutter步骤指示器插件flutter_stepindicator的使用

FlutterStepIndicator 是一个用于创建步骤指示器的多功能 Flutter 组件,适用于展示多步骤流程。它提供了广泛的自定义选项和功能来增强用户体验。

主要特性

  • 步骤显示:以吸引人的格式轻松可视化步骤列表或阶段。
  • 当前步骤高亮:高亮当前步骤以便于进度跟踪。
  • 可定制性:自定义活动和非活动步骤的外观,包括颜色选择。
  • 自定义勾选标记:使用自定义小部件(如勾选标记)作为成功指示符。
  • 动画效果:配置动画时长以实现平滑的步骤过渡和自定义动画。
  • 个性化:调整步骤的颜色、大小和形状以匹配应用的设计。
  • 步骤变更通知:使用 onChange 回调实现自定义操作。
  • 可选择性和验证:控制步骤的选择性以引导用户交互。

安装

pubspec.yaml 文件中添加依赖项:

dependencies:
  flutter_stepindicator: ^0.1.7

然后运行 flutter pub get 来获取包。

使用方法

导入包并在 Dart 文件中创建 FlutterStepIndicator 小部件,并提供必要的参数:

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

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

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

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

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

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

class _MyHomePageState extends State<MyHomePage> {
  int page = 1;
  int counter = 4;
  List<int> list = [0, 1, 2, 3, 4, 5];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text("PuzzleTak - Flutter_stepIndicator"),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            _example1(),
          ],
        ),
      ),
    );
  }

  Widget _example1() {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 5),
      child: Container(
        decoration: BoxDecoration(
          color: Theme.of(context).colorScheme.inversePrimary.withOpacity(0.0),
        ),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Container(
              padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15),
              alignment: Alignment.topLeft,
              child: Text(
                "Automatically scroller",
                style: TextStyle(
                  color: Theme.of(context).colorScheme.inverseSurface,
                  fontWeight: FontWeight.bold,
                  fontSize: 16,
                ),
              ),
            ),
            SizedBox(
              width: double.maxFinite,
              height: 30,
              child: Padding(
                padding: const EdgeInsets.symmetric(horizontal: 7),
                child: FlutterStepIndicator(
                  height: 28,
                  paddingLine: const EdgeInsets.symmetric(horizontal: 0),
                  positiveColor: const Color(0xFF00B551),
                  progressColor: const Color(0xFFEA9C00),
                  negativeColor: const Color(0xFFD5D5D5),
                  padding: const EdgeInsets.all(4),
                  list: list,
                  division: counter,
                  onChange: (i) {},
                  page: page,
                  onClickItem: (p0) {
                    setState(() {
                      page = p0;
                    });
                  },
                ),
              ),
            ),
            widgetOption(
              title: "update step ($page)",
              callAdd: () {
                if (page < list.length) {
                  setState(() {
                    page++;
                  });
                }
              },
              callRemove: () {
                if (page > 0) {
                  setState(() {
                    page--;
                  });
                }
              },
            ),
            widgetOption(
              title: "add item in list (${list.length})",
              callAdd: () {
                setState(() {
                  list.add(Random().nextInt(100));
                });
              },
              callRemove: () {
                setState(() {
                  list.removeAt(list.length - 1);
                });
              },
            ),
            widgetOption(
              title: "counter show (${counter - 1})",
              callAdd: () {
                setState(() {
                  counter++;
                });
              },
              callRemove: () {
                setState(() {
                  counter--;
                });
              },
            ),
          ],
        ),
      ),
    );
  }

  Widget widgetOption({
    required String title,
    required VoidCallback callAdd,
    required VoidCallback callRemove,
  }) {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 10),
      child: Container(
        padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 10),
        decoration: BoxDecoration(
          color: Colors.blueGrey.withOpacity(0.03),
          borderRadius: BorderRadius.circular(15),
        ),
        child: Column(
          children: [
            Container(
              width: double.maxFinite,
              height: 30,
              alignment: Alignment.center,
              child: Text(
                title,
                style: const TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                ElevatedButton(
                  onPressed: callAdd,
                  child: const Icon(Icons.add),
                ),
                ElevatedButton(
                  onPressed: callRemove,
                  child: const Icon(Icons.remove),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

参数说明

  • height: 设置步骤指示器的高度。
  • disableAutoScroll: 布尔值,启用或禁用自动滚动。
  • list: 提供要显示的步骤或阶段列表。
  • onChange: 步骤变化时触发的回调函数。
  • page: 当前步骤或页面。
  • positiveCheck: 可选的自定义勾选标记小部件。
  • positiveColor: 自定义活动步骤的颜色。
  • negativeColor: 自定义非活动步骤的颜色。
  • progressColor: 自定义进度指示器的颜色。
  • durationScroller: 设置滚动动画的持续时间。
  • durationCheckBulb: 设置勾选标记动画的持续时间。
  • division: 指定渲染步骤的数量。

通过上述示例和参数说明,您可以根据需要自定义 FlutterStepIndicator 的外观和行为。更多详细信息和完整示例可以参考 GitHub 示例


更多关于Flutter步骤指示器插件flutter_stepindicator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter步骤指示器插件flutter_stepindicator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用flutter_stepindicator插件来实现步骤指示器的代码示例。这个插件允许你创建一个可视化的步骤流程,帮助用户了解当前所在的步骤以及总步骤数。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_stepindicator: ^2.0.0  # 请注意版本号,这里使用的是2.0.0作为示例

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

接下来,在你的Dart文件中,你可以按照以下步骤来创建一个简单的步骤指示器:

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

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

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

class StepIndicatorPage extends StatefulWidget {
  @override
  _StepIndicatorPageState createState() => _StepIndicatorPageState();
}

class _StepIndicatorPageState extends State<StepIndicatorPage> {
  int _currentStep = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Step Indicator Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            StepIndicator(
              totalSteps: 5,
              currentStep: _currentStep,
              size: 24.0,
              dotSpacing: 12.0,
              activeDotColor: Colors.blue,
              dotColor: Colors.grey,
              lineActiveColor: Colors.blue,
              lineInactiveColor: Colors.grey.withOpacity(0.4),
              lineCompletedColor: Colors.blue.withOpacity(0.5),
              activeDotBorderRadius: 12.0,
              onCompleted: () {
                print("All steps completed!");
              },
              onStepTapped: (int step) {
                setState(() {
                  _currentStep = step;
                });
              },
              descriptions: [
                'Step 1: Introduction',
                'Step 2: Personal Details',
                'Step 3: Address',
                'Step 4: Payment',
                'Step 5: Confirmation',
              ],
            ),
            SizedBox(height: 24),
            ElevatedButton(
              onPressed: () {
                if (_currentStep < 4) {
                  setState(() {
                    _currentStep++;
                  });
                } else {
                  // Handle the last step or completion
                  print("Last step reached!");
                }
              },
              child: Text('Next'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个包含5个步骤的步骤指示器。每个步骤都有一个描述,当用户点击“Next”按钮时,当前步骤会增加。用户也可以通过点击步骤指示器上的点来直接跳转到相应的步骤。

  • totalSteps:总步骤数。
  • currentStep:当前步骤。
  • size:每个步骤点的大小。
  • dotSpacing:步骤点之间的间距。
  • activeDotColor:当前激活步骤点的颜色。
  • dotColor:未激活步骤点的颜色。
  • lineActiveColor:当前激活步骤的线条颜色。
  • lineInactiveColor:未激活步骤的线条颜色。
  • lineCompletedColor:已完成步骤的线条颜色。
  • activeDotBorderRadius:步骤点的圆角半径。
  • onCompleted:所有步骤完成时的回调。
  • onStepTapped:点击步骤时的回调。
  • descriptions:每个步骤的描述。

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

回到顶部