Flutter的Stepper

2023-11-02

Flutter的Stepper的简介

在Flutter中,Stepper(步进器)是一个用于创建逐步操作流程的UI控件。通常,步进器用于引导用户完成多个步骤或阶段的操作,例如创建一个多步骤表单、完成一个向导或者进行其他逐步操作。Stepper小部件提供了一种简便的方式来管理和导航这些步骤。

每个步骤通常包含一个标题和内容,并且通常具有向前和向后的导航按钮,以便用户可以在步骤之间导航。

Stepper的详细介绍

以下是有关如何使用Stepper的详细介绍:

使用方法

以下是Flutter中Stepper widget的基本使用方法:

导入flutter/material.dart包

首先,导入flutter/material.dart包,这样您就可以使用Stepper widget。

import 'package:flutter/material.dart';

创建状态变量

然后,创建一个状态变量,该变量将控制当前活动的步骤索引。

int _currentStep = 0;

创建Stepper

创建一个Stepper widget,设置其类型(垂直或水平)、当前步骤索引和步骤列表。步骤列表是由Step widget组成的列表,每个Step widget都有一个标题和内容,并且通常具有向前和向后的导航按钮,以便用户可以在步骤之间导航。

Stepper(
  type: StepperType.vertical,
  currentStep: _currentStep,
  onStepContinue: () {
    setState(() {
      _currentStep < _steps.length - 1
          ? _currentStep += 1
          : _currentStep = 0;
    });
  },
  onStepCancel: () {
    setState(() {
      _currentStep > 0 ? _currentStep -= 1 : _currentStep = 0;
    });
  },
  steps: _steps,
)

创建一个Step widget列表

创建一个Step widget列表,每个Step widget都有一个标题和内容,并且通常具有向前和向后的导航按钮,以便用户可以在步骤之间导航。

List<Step> _steps = [
  Step(
    title: Text('Step 1'),
    content: Text('This is the first step.'),
    isActive: _currentStep == 0,
  ),
  Step(
    title: Text('Step 2'),
    content: Text('This is the second step.'),
    isActive: _currentStep == 1,
  ),
  Step(
    title: Text('Step 3'),
    content: Text('This is the third step.'),
    isActive: _currentStep == 2,
  ),
];

在这个例子中,_steps变量是一个包含三个Step widget的列表,每个Step widget都有一个标题、内容和isActive属性。isActive属性指示当前步骤是否处于活动状态,它的值根据当前步骤的索引和_step变量的值来确定。

典型用法

下面这个例子详细说明了各个回调函数的用法

Stepper(
  currentStep: _currentStep, // 当前步骤的索引
  onStepTapped: (step) {
    // 当用户点击步骤时触发的回调
    setState(() {
      _currentStep = step;
    });
  },
  onStepContinue: () {
    // 当用户点击“继续”按钮时触发的回调
    if (_currentStep < _steps.length - 1) {
      setState(() {
        _currentStep++;
      });
    }
  },
  onStepCancel: () {
    // 当用户点击“取消”按钮时触发的回调
    if (_currentStep > 0) {
      setState(() {
        _currentStep--;
      });
    }
  },
  steps: _steps, // 步骤列表
)

让我们详细解释上述代码中的关键部分:

currentStep:这是一个整数值,表示当前选中的步骤的索引。你可以将其与onStepTapped回调一起使用,以便在用户点击步骤时更新当前步骤。

onStepTapped:这是一个回调函数,当用户点击某个步骤时触发。通常,你会在这个回调中更新currentStep,以反映用户选择的步骤。

onStepContinue:这是一个回调函数,当用户点击“继续”按钮时触发。通常,你会在这个回调中增加currentStep的值,以使用户前进到下一步。

onStepCancel:这是一个回调函数,当用户点击“取消”按钮时触发。通常,你会在这个回调中减少currentStep的值,以使用户返回上一步。

steps:这是一个步骤列表,每个步骤都是一个Step对象。每个Step对象包括一个标题和内容,你可以自定义这些内容以适应你的需求。

Step对象的创建

下面是一个示例Step对象的创建:

Step(
  title: Text('Step 1'),
  content: Text('This is the content for Step 1.'),
)

在这个示例中,Step包括一个标题(标题可以是任何Widget)和内容(也可以是任何Widget)。你可以根据需要添加更多的Step对象。

Stepper控件的外观和行为可以根据你的设计需求进行自定义,包括颜色、图标、按钮文本等。你可以使用controlsBuilder属性自定义步骤操作按钮的外观和文本。

通过使用Stepper小部件,你可以轻松创建具有多个步骤的用户界面,以引导用户完成各种复杂的任务和操作。

例子

在这个例子中,Stepper被设置为垂直类型,使用_currentStep变量作为当前步骤的索引,使用onStepContinue和onStepCancel回调函数处理向前和向后导航按钮的单击事件,并且_steps变量是一个包含三个Step widget的列表。

Stepper widget提供了一种方便的方式来创建多步骤的向导/流程,使用户可以轻松地在步骤之间导航,并且可以很容易地自定义每个步

源码

源码如下:

import 'package:flutter/material.dart';

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

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

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


class _MyHomePageState extends State<MyHomePage> {
  var _currentStep = 0;
  List<Step> _widgetList = [];

  _myStepper() {
    return Stepper(
      steps: _getStepList(),
      physics: const AlwaysScrollableScrollPhysics(),
      type: StepperType.vertical,
      currentStep: _currentStep,
      onStepTapped: (index) {
        print('step index = $index');
        setState(() {
          _currentStep = index;
        });
      },
      onStepContinue: () {
        setState(() {
          if (_currentStep < _widgetList.length - 1) {
            _currentStep++;
          }
        });
      },
      onStepCancel: () {
        setState(() {
          if (_currentStep > 0) {
            _currentStep--;
          }
        });
      },
    );
  }

  _myStep(int i) {
    return Step(
      title: Text('Step title$i'),
      subtitle: Text('Step subtitle$i'),
      content: Text('Step content$i'),
      state: _getStepState(i),
      isActive: _currentStep == i ? true : false,
    );
  }

  _getStepState(int i) {
    switch (i) {
      case 1:
        return StepState.editing;
      case 2:
        return StepState.disabled;
      case 3:
        return StepState.complete;
      case 4:
        return StepState.error;
      default:
        return StepState.indexed;
    }
  }

  _getStepList() {
    _widgetList.clear();
    for (var i = 0; i < 10; i++) {
      _widgetList.add(_myStep(i));
    }
    return _widgetList;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Stepper'),
      ),
      body: _myStepper(),
    );
  }


}

例子效果图

效果如图:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter的Stepper 的相关文章

  • 如何在 flutter 中用动画 POP

    我正在触发 Navigator pop 事件 并且想要淡出到页面的过渡 我尝试过 Fluro 但没有尝试过 我对实施它不感兴趣 这就是我正在做的 Widget build BuildContext context return Scaffo
  • 有没有办法模拟小部件或屏幕特定位置的触摸?

    我想触摸或点击小部件上的某处 而不让用户在此时明确触摸屏幕 有什么办法可以做到吗 我已经检查了SO答案 有些人建议使用 集成测试 但在未物理或以某种方式连接到笔记本电脑的设备上无法执行 集成测试 无法找到更好的措辞 我还尝试进行 hitTe
  • 如何取消配置 flutterfire?

    我们在 CLI 中使用以下命令将 flutter 应用程序与 firebase 连接 flutterfire configure 如文档中所述 https firebase flutter dev docs overview https f
  • 使用 flutter 处理 Appcheck 时出错

    我想在 firebase 存储中上传文件 但经过多次研究后出现了 appcheck 错误 我发现我必须在 firebase 上激活 Appcheck 而且还要在我的应用程序上激活它 在 youtube 上的谷歌视频中 我看到我必须在构建我的
  • Flutter 中 `Future.delayed(Duration.zero, ...)` 和 `SchedulerBinding.instance.addPostFrameCallback(...)` 有什么区别?

    正如所见https stackoverflow com a 49458289 5150593 https stackoverflow com a 49458289 5150593 本质上有两种访问方式BuildContext最初在 Flut
  • 在 ListView 上构建期间调用 setState() 或 markNeedsBuild()

    所以我试图重构我的 listView 逻辑 基本上我的 ListView 的 UI 逻辑变得很麻烦 所以我决定 为什么不将 UI 逻辑的某些部分移动到另一个类 这是我的代码 列表页 dart import package flutter m
  • 如何在多个包之间共享analysis_options.yaml 文件?

    我正在开发一个Flutter Module 多种的Flutter Plugins 他们之间的关系是 module取决于所有plugins 所有插件均未发布到 pub 并使用 git 依赖项 我现在需要添加analysis options y
  • 带 NestedScrollview 的 RefreshIndicator

    我想要 2 个带有 ListView 的选项卡页共享一个 RefreshIndicator 但是 RefreshIndicator 必须具有 Scrollable 作为子级 TabBarView 则不然 因此我尝试为每个选项卡创建 2 个
  • 在 Flutter 中显示 CircularProgressIndicator 在前面

    我想显示一个圆形栏 就像在其他小部件前面加载一样 下面是我当前正在使用的代码 它显示了循环加载 但它位于其他小部件之间 它应该在顶部 根据我尝试使用 Stack 的建议 但它仍然显示在小部件之间 我在这里做错了什么 class LoginP
  • 更改语言 Flutter 的按钮

    我正在 Flutter 中构建一个应用程序 到目前为止 我正在使用 JSON 国际化 其中应用程序的语言基于用户手机中默认的语言 它工作得很好 但我想给用户有机会在不更改手机系统语言设置的情况下更改语言 只需单击按钮 然后应用程序即可更改语
  • 打开键盘会导致有状态小部件重新初始化

    我在 Stable 分支中使用 Flutter 1 2 1 为了说明我的问题 假设我有页面 A 和 B A 使用以下命令导航到 BNavigator pushB 使用以下命令导航回 ANavigator pop 两者都是有状态的小部件 当我
  • 如何在flutter中绕过SSL证书验证?

    如何在flutter中绕过SSL证书验证 错误 握手异常 客户端中的握手错误 操作系统错误 CERTIFICATE VERIFY FAILED 自签名证书 handshake cc 345 您需要配置 HttpService 以使用自签名
  • NestedScrollView 与 ListView 中的粘性选项卡

    布局按预期工作 但以下情况除外 当我滚动一页时 第二页也会滚动 没有那么多 但足以掩盖第一个项目 我可以想象它与 NestedScrollView 有关 但我不知道如何继续 import package flutter material d
  • Flutter如何在BottomNavigationBar中添加边距或填充

    我正在尝试制作底部导航栏 但在屏幕上左右填充 现在 我用容器包裹 BottomNavigationBar 并在其中添加填充 问题是 BottomNavigationBar 默认背景仍然包裹所有图层 所以我们可以删除那里的背景颜色吗 Goal
  • 如何在Flutter中使用多个ChangeNotifierProvider?

    我最近开始使用provider对于我的状态管理 我知道如何一次使用一个 class Home extends StatelessWidget override Widget build BuildContext context return
  • 当我使用 ListView 时,ListTile OnTap 正在工作。但是当我使用 ListWheelScrollView 时它不起作用

    当我使用 ListView 时 ListTile OnTap 正在工作 但是当我使用 ListWheelScrollView 时它不起作用 我的意思是它不会被窃听 观点发生变化 但我似乎无法点击它 我在很多地方和链接中寻找解决方案 但仍然找
  • flutter 中 sqlite 中的多个参数

    我想知道如何将多个参数传递给 sqllite 中的原始查询 我的代码如下 query async get a reference to the database Database db await DatabaseHelper instan
  • 用颤动画布在形状上切一个洞

    如何使用颤动画布在形状上 切一个洞 我有一组相当复杂的形状 看起来像现实世界的物体 该物体上有一个圆角矩形形状的孔 我真的很想从形状中减去 RRect 但我找不到任何有关如何执行此操作的信息 canvas clipRRect myRRect
  • 配置根项目“firebase_auth”时出现问题

    my error 我无法构建 apk 发布文件 我完成了应用程序一段时间 没有出现错误 几天后 我在构建应用程序时收到此错误 请告诉我如何摆脱它 我尝试了 4 个小时 什么也没得到 FAILURE Build failed with an
  • Flutter http请求上传mp3文件

    我使用这个 api 上传 mp3 文件 使用这种方法 Future

随机推荐

  • 【JavaScript 逆向】521 加速乐多层响应 Cookie 逆向

    前言 现在一些网站对 JavaScript 代码采取了一定的保护措施 比如变量名混淆 执行逻辑混淆 反调试 核心逻辑加密等 有的还对数据接口进行了加密 这次的案例是对加速乐 AAEncode OB 混淆方式的破解 声明 本文章中所有内容仅供
  • Hadoop使用

    1 常用命令 1 namenode格式化 hdfs namenode format 2 启动历史服务器 mapred daemon start historyserver 或者mr jobhistory daemon sh stop his
  • Git仓库版本的回退/前进

    前言 版本库做为一个可迭代更新的仓库 不可能只是单纯提供版本更新操作 其最重要的还是提供了历史版本回滚功能 在使用版本回滚功能前 我们会使用一系列的辅助查询命令 比如查看版本信息 仓库状态能命令 辅助是否需要进行回滚操作 一 查看版本信息
  • 运算放大器的应用(一)放大器

    在硬件电路设计中 运算放大器的应用非常广泛 今天来记录一下作为放大器的应用和公式推导 放大器典型电路 根据放大器基本原理 虚短 特性可知 U0 U1 根据 虚断 特性可知 U1点电流近似为0 则流过R1的电流等于流过R2的电流 根据欧姆定律
  • Photoshop 2023 Beta 内置Ai绘图功能介绍&安装教程

    距离Adobe软件公司首次将图像编辑及数字绘画软件Photoshop推出到大众面前已经过去35年 最近该公司又再次书写了属于Photoshop的历史新篇章 最近 Adobe 宣布 Photoshop Beta 迎来更新 新增 创意填充 Ge
  • linux下使用selenium

    1 需要linux安装chrome浏览器 安装命令 yum localinstall google chrome stable current x86 64 rpm 2 得的谷歌浏览器版本号 根据版本号选择最接近的内核版本 linux命令
  • 反射获取类的成员变量值

    public class ClassFieldTest public ClassFieldTest List
  • machine unlearning 论文阅读笔记

    文章目录 前言 概要 导论 unlearning 定义 SISA 系统 时间复杂度 实验测试 总结 前言 做一篇发表在顶会S P 4 2 n d 42 nd
  • Connection reset by peer

    今天升级完openssh8 6以后突然发现无法连接服务器了 注意前提是升级成功了 连接时报错如下 Connection reset by peer 解决方案 使用root执行命令 echo sshd ALL gt gt etc hosts
  • 【mcuclub】水流量检测模块-YF-S401

    一 实物图 型号 YF S401 二 原理图 编号 名称 功能 1 VCC 电源正 红色线 2 GND 电源地 黑色线 3 OUT 输出引脚 黄色线 三 简介 水流量传感器主要由塑料阀体 水流转子组件和霍尔传感器组成 它装在电器的进水端 用
  • JVM--调优--03--开发配置

    JVM 调优 03 开发配置 1 本地配置 Xmx1g Xms1g Xmn900m XX UseG1GC Xloggc gc log XX PrintGCDetails 2 linux tomcat 配置 进入tomcat的bin目录 修改
  • 软工作业 双人项目代码规范

    双人项目代码编写规范 蔡东杰 房林尧 以下共分为四个部分 缩进代码 命名规则 代码注释 异常处理 部分规范已做实例说明 后续编代码时需要严格遵守 一 关于缩进代码 一行里面只写一行代码 包括定义变量 一行只定义一个 左括号和后一个字符之间不
  • Java分支和循环语句及方法的使用

    1 分支语句No3 顺序语句 分支语句 循环语句 1 1 分支语句 选择结构 分支语句满足某种条件则执行某一部分 满足另一种条件则执行另一部分 1 2 if语句 简单分支语句 if boolean类型表达式 语句 如果小括号中的表达式成立
  • STM32中断知识点简介

    中断服务函数存放路径为启动文件 startup stm32f10x hd 1 常用的中断服务函数 外部中断服务函数 EXTI0 IRQHandler EXTI0 IRQn EXTI1 IRQHandler EXTI1 IRQn EXTI2
  • jenkins默认会存放目录

    jenkins默认会存放在用户主目录下的 jenkins文件夹中 如 Linux root用户 root jenkins 注意 这是linux版本的 windows系统请自行更改 这个值在Jenkins运行时是不能更改的 请先将Jenkin
  • 自定义coco数据集

    1 环境 anaconda环境安装配置 2 工具 安装labelme工具 3 安装软件 3 1 打开anaconda控制台 3 2 创建虚拟环境 conda create n labelme python 3 7 3 3 激活环境 cond
  • 函数调用栈

    函数调用栈 我们在编程中写的函数 会被编译器编译为机器指令 写入可执行文件 程序执行的时候 会把这个可执行文件加载到内存 在虚拟地址空间中的代码段存放 如果在一个函数中调用另一个函数 编译器就会对应生成一条call指令 当程序执行到这条ca
  • 不使用mybatis的@Param有的报错有的却不报错问题

    前几天更换电脑重新安装新的idea发现在dao层 有的同事没有使用 Param注解 导致系统报错 错误如下 org mybatis spring MyBatisSystemException nested exception is org
  • 显示实例化和显示具体化

    struct man int age double salary 显示具体化 指定模板函数中类型 意思是不要使用swap模板来生成函数定义 而是要使用专门为job类型显示定义的函数定义 因为job是一个结构体 所以swap不可能是直接的利用
  • Flutter的Stepper

    文章目录 Flutter的Stepper的简介 Stepper的详细介绍 使用方法 导入flutter material dart包 创建状态变量 创建Stepper 创建一个Step widget列表 典型用法 Step对象的创建 例子