Flutter步骤导航插件cool_stepper的使用

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

Flutter步骤导航插件cool_stepper的使用

简介

cool_stepper 是一个Flutter插件,用于显示分步骤的操作流程。它在表单向导或引导页面中非常有用。

使用方法

添加依赖

在你的 pubspec.yaml 文件中添加 cool_stepper 作为依赖:

dependencies:
  cool_stepper: ^1.0.0

然后在你的Dart文件中导入 cool_stepper

import 'package:cool_stepper/cool_stepper.dart';

示例

以下是一个完整的示例代码,展示了如何使用 cool_stepper 插件创建一个多步骤表单:

import 'package:cool_stepper/cool_stepper.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Cool Stepper',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
        fontFamily: GoogleFonts.poppins().fontFamily,
      ),
      debugShowCheckedModeBanner: false,
      home: MyHomePage(title: 'Cool Stepper'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _formKey = GlobalKey<FormState>();
  String? selectedRole = 'Writer';
  final TextEditingController _nameCtrl = TextEditingController();
  final TextEditingController _emailCtrl = TextEditingController();

  @override
  Widget build(BuildContext context) {
    final steps = [
      CoolStep(
        title: 'Basic Information',
        subtitle: 'Please fill some of the basic information to get started',
        content: Form(
          key: _formKey,
          child: Column(
            children: [
              _buildTextField(
                labelText: 'Name',
                validator: (value) {
                  if (value!.isEmpty) {
                    return 'Name is required';
                  }
                  return null;
                },
                controller: _nameCtrl,
              ),
              _buildTextField(
                labelText: 'Email Address',
                validator: (value) {
                  if (value!.isEmpty) {
                    return 'Email address is required';
                  }
                  return null;
                },
                controller: _emailCtrl,
              ),
            ],
          ),
        ),
        validation: () {
          if (!_formKey.currentState!.validate()) {
            return 'Fill form correctly';
          }
          return null;
        },
      ),
      CoolStep(
        title: 'Select your role',
        subtitle: 'Choose a role that better defines you',
        content: Container(
          child: Row(
            children: <Widget>[
              _buildSelector(
                context: context,
                name: 'Writer',
              ),
              SizedBox(width: 5.0),
              _buildSelector(
                context: context,
                name: 'Editor',
              ),
            ],
          ),
        ),
        validation: () {
          return null;
        },
      ),
    ];

    final stepper = CoolStepper(
      showErrorSnackbar: false,
      onCompleted: () {
        print('Steps completed!');
      },
      steps: steps,
      config: CoolStepperConfig(
        backText: 'PREV',
      ),
    );

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Container(
        child: stepper,
      ),
    );
  }

  Widget _buildTextField({
    String? labelText,
    FormFieldValidator<String>? validator,
    TextEditingController? controller,
  }) {
    return Padding(
      padding: const EdgeInsets.only(bottom: 20.0),
      child: TextFormField(
        decoration: InputDecoration(
          labelText: labelText,
        ),
        validator: validator,
        controller: controller,
      ),
    );
  }

  Widget _buildSelector({
    BuildContext? context,
    required String name,
  }) {
    final isActive = name == selectedRole;

    return Expanded(
      child: AnimatedContainer(
        duration: Duration(milliseconds: 200),
        curve: Curves.easeInOut,
        decoration: BoxDecoration(
          color: isActive ? Theme.of(context!).primaryColor : null,
          border: Border.all(
            width: 0,
          ),
          borderRadius: BorderRadius.circular(8.0),
        ),
        child: RadioListTile(
          value: name,
          activeColor: Colors.white,
          groupValue: selectedRole,
          onChanged: (String? v) {
            setState(() {
              selectedRole = v;
            });
          },
          title: Text(
            name,
            style: TextStyle(
              color: isActive ? Colors.white : null,
            ),
          ),
        ),
      ),
    );
  }
}

CoolStepper 类

属性 数据类型 描述 默认值
onCompleted Void Function() 当所有步骤完成时触发的函数 Null
steps List<CoolStep> 步骤列表 Null
config CoolStepperConfig 用于自定义Stepper的配置 CoolStepperConfig(backText: “BACK”, nextText: “NEXT”, stepText: “STEP”, ofText: “OF”)
showErrorSnackbar boolean 如果设置为true,当步骤验证失败时会在页面底部显示Snackbar false

CoolStepperConfig 属性

属性 数据类型 描述 默认值
backText String 返回按钮的文本 BACK
nextText String 下一步按钮的文本 NEXT
finalText String 最后一步的下一步按钮文本 FINISH
stepText String 描述进度的文本 STEP
ofText String 描述进度的文本 OF
headerColor Color 头部背景颜色 Theme.of(context).primaryColor.withOpacity(0.1)
iconColor Color 图标的颜色 Colors.black38
icon Icon 替换默认图标的图标 Icon(Icons.help_outline, size: 18, color: Colors.black38)
titleTextStyle TextStyle 标题文本样式 TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, color: Colors.black38)
subtitleTextStyle TextStyle 副标题文本样式 TextStyle(fontSize: 14.0, fontWeight: FontWeight.w600, color: Colors.black)
backTextList List<String> 覆盖backText的字符串列表 null
nextTextList List<String> 覆盖nextText的字符串列表 null

希望这个示例对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用cool_stepper插件的示例代码。cool_stepper是一个用于创建步骤导航的Flutter插件,它可以帮助用户按照一系列步骤完成任务。

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

dependencies:
  flutter:
    sdk: flutter
  cool_stepper: ^x.y.z  # 请替换为实际的版本号

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

接下来,在你的Dart文件中,你可以按照以下方式使用cool_stepper

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Cool Stepper Example'),
        ),
        body: Center(
          child: StepperExample(),
        ),
      ),
    );
  }
}

class StepperExample extends StatefulWidget {
  @override
  _StepperExampleState createState() => _StepperExampleState();
}

class _StepperExampleState extends State<StepperExample> {
  int _currentStep = 0;

  List<Step> _steps = [
    Step(
      title: Text('Step 1: Enter your name'),
      content: TextField(
        decoration: InputDecoration(labelText: 'Name'),
        onEditingComplete: () => _nextStep(),
      ),
    ),
    Step(
      title: Text('Step 2: Enter your email'),
      content: TextField(
        decoration: InputDecoration(labelText: 'Email'),
        keyboardType: TextInputType.emailAddress,
        onEditingComplete: () => _nextStep(),
      ),
    ),
    Step(
      title: Text('Step 3: Review your information'),
      content: Column(
        children: <Widget>[
          Text('Name: '),
          Text('Email: '),
          // 在这里你可以添加实际的逻辑来显示用户输入的信息
        ],
      ),
    ),
  ];

  void _nextStep() {
    setState(() {
      if (_currentStep < _steps.length - 1) {
        _currentStep += 1;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return CoolStepper(
      steps: _steps,
      currentStep: _currentStep,
      onStepTapped: (step) {
        setState(() {
          _currentStep = step;
        });
      },
      onStepContinue: () {
        // 当用户点击继续按钮时执行的逻辑
        // 例如,验证输入的信息
        if (_currentStep == _steps.length - 1) {
          // 完成所有步骤后的逻辑
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('All steps completed!')),
          );
        } else {
          _nextStep();
        }
      },
      onStepCancel: () {
        // 当用户点击取消按钮时执行的逻辑
        setState(() {
          if (_currentStep > 0) {
            _currentStep -= 1;
          }
        });
      },
      continueButtonText: 'Continue',
      cancelButtonText: 'Cancel',
    );
  }
}

在这个示例中:

  1. 我们创建了一个包含三个步骤的简单步骤导航。
  2. 每个步骤包含一个标题和一个内容区域。内容区域是一个TextField,用于输入用户的信息。
  3. 使用CoolStepper组件来显示步骤导航,并处理步骤之间的切换。
  4. onStepTappedonStepContinueonStepCancel方法用于处理用户点击步骤、继续和取消按钮时的逻辑。

请根据你的实际需求调整代码,并添加必要的验证和数据处理逻辑。

回到顶部