当前位置: 首页 > news >正文

TextFormField onSave 和onChange

背景:用户在注册发送验证码的时候,发现一直获取不了_username

原因:_username 用的是 TextFormField onSave 由于这个时候表单并未提交,未触发onSave事件,所以一直取不到_username的值。

  submit() {var state = this._formKey.currentState;if (state != null && state.validate()) {state.save();Future(() async {return OauthService.loginVerCode(_username, _validateCodeId, _validateCode);}).then((value) =>{if (value) {Navigator.pushNamed(context, '/')}});}}

在Flutter的TextFormField中,onSaved和onChange是两个重要的回调函数,它们分别用于处理表单字段的保存逻辑和实时输入变化。下面是这两个属性的详细说明及如何使用它们:
1. onSaved
用途: 当调用FormState.save()方法时(通常在表单提交时),会触发onSaved回调。这个回调适合用来验证用户输入并持久化数据到模型对象中。
参数: 接受一个ValueSetter<T>类型的参数,其中T是TextFormField的controller的text属性的类型(通常是String)。这个回调允许你直接对表单字段的值进行操作或存储。
示例:

TextFormField(onSaved: (value) {// 这里的"value"就是用户输入的内容,你可以在这里进行数据验证和保存操作// 例如:_username = value; // 假设_username是类的一个成员变量,用于存储用户名},
)

2. onChanged
用途: 每当TextFormField中的文本发生变化时,就会调用onChanged回调。这个回调适用于实时响应用户输入,比如进行实时验证或更新UI。
参数: 接受一个ValueChanged<String>类型的参数,即每当文本变化时都会调用的函数,传入最新的文本值。
示例:

TextFormField(onChanged: (value) {// "value"是当前输入框的最新值,可以在此处执行实时验证或更新其他UI元素// 例如显示字符计数或即时反馈输入是否有效setState(() {_inputText = value; // 更新状态,以便可能影响UI的其他部分});},
)

综合使用
通常,onChanged用于提供即时反馈或动态处理,而onSaved则在表单提交时用于数据验证和最终保存。结合两者,可以创建交互性好且健壮的表单体验。

TextFormField(onChanged: (value) {// 实时处理逻辑setState(() {_username = value;});},onSaved: (value) {// 表单提交时的处理逻辑_finalUsername = value; // 确保数据有效后保存到最终变量},
)

记得在表单的RaisedButton或ElevatedButton的onPressed中调用_formKey.currentState.save();来触发所有onSaved回调。这里_formKey是与Form widget关联的GlobalKey<FormState>。

相关文章:

  • 43-3 应急响应 - WebShell查杀工具
  • 三十、openlayers官网示例解析Double click, Drag and Zoom——第二次点击鼠标拖拽缩放地图效果、取消地图双击放大事件
  • Java中的super关键字详解
  • 探秘AI艺术:揭开Midjourney绘画的神秘面纱
  • excel表格里怎样不删除0,又不显示0呢?
  • 重学java51.Collections集合工具类、泛型
  • 电商推荐系统+电影推荐系统【虚拟机镜像分享】
  • java面试中高频问题----1
  • 妙味web前端开发全套视频教程:深度解析与精彩呈现
  • kubernetes-PV与PVC
  • 【axios】的浅度分析
  • 【CSS】计算属性 calc 函数
  • leetcode-设计LRU缓存结构-112
  • Matlab|基于PMU相量测量单元进行电力系统电压幅值和相角状态估计
  • 2024最新 Jenkins + Docker实战教程(七)- Jenkins实现远程传输和自动部署
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Bootstrap JS插件Alert源码分析
  • CODING 缺陷管理功能正式开始公测
  • Date型的使用
  • Github访问慢解决办法
  • Java读取Properties文件的六种方法
  • Laravel Mix运行时关于es2015报错解决方案
  • Material Design
  • MySQL用户中的%到底包不包括localhost?
  • PHP变量
  • Webpack 4 学习01(基础配置)
  • 阿里云前端周刊 - 第 26 期
  • 代理模式
  • 订阅Forge Viewer所有的事件
  • 将回调地狱按在地上摩擦的Promise
  • 使用API自动生成工具优化前端工作流
  • 跳前端坑前,先看看这个!!
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • Prometheus VS InfluxDB
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​Linux·i2c驱动架构​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #pragma once与条件编译
  • (8)STL算法之替换
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (翻译)terry crowley: 写给程序员
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (小白学Java)Java简介和基本配置
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .bat批处理(六):替换字符串中匹配的子串
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 指南:抽象化实现的基类
  • ??javascript里的变量问题
  • @requestBody写与不写的情况