flutter 输入框组件TextField的实现代码

TextField

顾名思义文本输入框,类似于iOS中的UITextField和Android中的EditText和Web中的TextInput。主要是为用户提供输入文本提供方便。相信大家在原生客户端上都用过这个功能,就不在做具体介绍了,接下来还是具体介绍下Flutter中TextField的用法。

以下内容已更新到 github

TextField的构造方法:

const TextField({
  Key key,
  this.controller,      //控制器,控制TextField文字
  this.focusNode,
  this.decoration: const InputDecoration(),   //输入器装饰
  TextInputType keyboardType: TextInputType.text, //输入的类型
  this.style,
  this.textAlign: TextAlign.start,
  this.autofocus: false,
  this.obscureText: false, //是否隐藏输入
  this.autocorrect: true,
  this.maxLines: 1,
  this.maxLength,
  this.maxLengthEnforced: true,
  this.onChanged,      //文字改变触发
  this.onSubmitted,     //文字提交触发(键盘按键)
  this.onEditingComplete, //当用户提交可编辑内容时调用
  this.inputFormatters,
  this.enabled,
  this.cursorWidth = 2.0,
  this.cursorRadius,
  this.cursorColor,
  this.keyboardAppearance,
 })

先来试试最基本的TextField:

/*
 * Created by 李卓原 on 2018/9/7.
 * email: zhuoyuan93@gmail.com
 *
 */

import 'package:flutter/material.dart';

class TextFieldAndCheckPage extends StatefulWidget {
 @override
 State<StatefulWidget> createState() => TextFieldAndCheckPageState();
}

class TextFieldAndCheckPageState extends State<TextFieldAndCheckPage> {
 @override
 Widget build(BuildContext context) {
  return Scaffold(appBar: AppBar(
   title: Text('输入和选择'),
  ),body:TextField(),
  );
 }
}

这是一个默认的输入框,我们什么都没有做的时候的样子.

然后我们试一下它的属性

TextField(
    keyboardType: TextInputType.number,
    decoration: InputDecoration(
     contentPadding: EdgeInsets.all(10.0),
     icon: Icon(Icons.text_fields),
     labelText: '请输入你的姓名)',
     helperText: '请输入你的真实姓名',
    ),
    onChanged: _textFieldChanged,
    autofocus: false,
   ),

 void _textFieldChanged(String str) {
  print(str);
 }

我们增加一个keyboardType属性,把keyboardType设置为TextInputType.number

可以看到每次我们让TextField获得焦点的时候弹出的键盘就变成了数字优先了。

然后我们为输入框做一些其他的效果,如提示文字,icon、标签文字等。

我们给上面的代码新增decoration属性,设置相关属性,可以发现当我们的TextField获得焦点时,图标会自动变色,提示文字会自动上移。

还可以看到 我加了一个onChanged

onChanged是每次输入框内每次文字变更触发的回调,onSubmitted是用户提交而触发的回调。

每当用户改变输入框内的文字,都会在控制台输出现在的字符串.与onSubmitted用法相同.

接下来,我们实现一个简单的登录页面:

/*
 * Created by 李卓原 on 2018/9/7.
 * email: zhuoyuan93@gmail.com
 *
 */

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

class TextFieldAndCheckPage extends StatefulWidget {
 @override
 State<StatefulWidget> createState() => TextFieldAndCheckPageState();
}

class TextFieldAndCheckPageState extends State<TextFieldAndCheckPage> {
 //手机号的控制器
 TextEditingController phoneController = TextEditingController();

 //密码的控制器
 TextEditingController passController = TextEditingController();

 @override
 Widget build(BuildContext context) {
  return Scaffold(
   appBar: AppBar(
    title: Text('输入和选择'),
   ),
   body: Column(
    children: <Widget>[
     TextField(
      controller: phoneController,
      keyboardType: TextInputType.number,
      decoration: InputDecoration(
       contentPadding: EdgeInsets.all(10.0),
       icon: Icon(Icons.phone),
       labelText: '请输入你的用户名)',
       helperText: '请输入注册的手机号',
      ),
      autofocus: false,
     ),
     TextField(
       controller: passController,
       keyboardType: TextInputType.number,
       decoration: InputDecoration(
        contentPadding: EdgeInsets.all(10.0),
        icon: Icon(Icons.lock),
        labelText: '请输入密码)',
       ),
       obscureText: true),
     RaisedButton(
      onPressed: _login,
      child: Text('登录'),
     ),
    ],
   ),
  );
 }

 void _login() {
  print({'phone': phoneController.text, 'password': passController.text});
  if (phoneController.text.length != 11) {
   showDialog(
     context: context,
     builder: (context) => AlertDialog(
        title: Text('手机号码格式不对'),
       ));
  } else if (passController.text.length == 0) {
   showDialog(
     context: context,
     builder: (context) => AlertDialog(
        title: Text('请填写密码'),
       ));
  } else {
   showDialog(
     context: context,
     builder: (context) => AlertDialog(
        title: Text('登录成功'),
       ));
   phoneController.clear();
  }
 }

 void onTextClear() {
  setState(() {
   phoneController.clear();
   passController.clear();
  });
 }
}

在布局上,我们使用一个Column包含了两个TextField和一个RaisedButton。

在逻辑上,每当我们点击下面的按钮都会判断用户名密码是否符合要求,并且使用控制器清空已经输入的用户名和密码。

当用户输入的手机号码不是11位的时候提示手机号码格式错误,

当用户没有输入密码时,提示填写密码,

用户名和密码符合要求时提示登录成功。

我这里登录成功之后还调了一个方法:phoneController.clear() 清空了用户名输入框中的内容。

代码的逻辑很简单。关于TextField的其他用法就不在一一介绍了,有兴趣的小伙伴可以自己尝试下.

使用decoration美化输入框

先看一下效果:

代码:

TextField(
      controller: accountController,
      decoration: InputDecoration(
       border: OutlineInputBorder(),
       hintText: '请输入账号',
       labelText: '左上角',
       prefixIcon: Icon(Icons.person),
      ),
     )

可以看到,我先添加了一个decoration属性.

decoration属性介绍:

  • border:增加一个边框,
  • hintText:未输入文字时,输入框中的提示文字,
  • prefixIcon:输入框内侧左面的控件,
  • labelText:一个提示文字。输入框获取焦点/输入框有内容 会移动到左上角,否则在输入框内,labelTex的位置.
  • suffixIcon: 输入框内侧右面的图标.
  • icon : 输入框左侧添加个图标

在多个输入框内切换焦点

介绍一下onEditingComplete这个方法:

当用户提交可编辑内容时调用(例如,用户按下键盘上的“done”按钮)。

onEditingComplete的默认实现根据情况执行2种不同的行为:

  • 当完成操作被按下时,例如“done”、“go”、“send”或“search”,用户的内容被提交给[controller],然后焦点被放弃。
  • 当按下一个未完成操作(如“next”或“previous”)时,用户的内容被提交给[controller],但不会放弃焦点,因为开发人员可能希望立即将焦点转移到[onsubmit]中的另一个输入小部件。

我们有时候会需要这样的情况, 比如一个登录页面, 需要输入账号和密码 , 自然输入完账号就要输入密码了 , 我们在输入账号结束的时候 , 让密码输入框获取到焦点 .

看一下代码:

...
 FocusNode secondTextFieldNode = FocusNode();
...
Column(
    children: <Widget>[
     TextField(
      /* onChanged: (text) {
     value = text;
     print(value);
    },*/
      autofocus: false, //是否自动获取焦点
      controller: _textController,
      decoration: InputDecoration(
       suffixIcon: Icon(Icons.chevron_right), //输入框内右侧图标
       icon: Icon(Icons.person), //输入框左侧图标
       prefixIcon: Icon(Icons.skip_previous), //输入框内左侧图标
       labelText: 'labelText',
       hintText: 'hintText',
       helperText: 'helperText',
      ),
      onEditingComplete: () =>
        FocusScope.of(context).requestFocus(secondTextFieldNode),
     ),
     TextField(
      focusNode: secondTextFieldNode,
      decoration: InputDecoration(
        contentPadding: EdgeInsets.symmetric(horizontal: 15.0)),
     ),
    ],
   ),

我在顶层创建了一个交电接点并附加给第二个输入框,

在第一个输入框的onEditingComplete方法中是用

FocusScope.of(context).requestFocus(secondTextFieldNode),

方法来让第二个输入框请求获取焦点,

当然你也可以添加个按钮 , 点击按钮执行这个方法来实现切换焦点的功能.

keyboardType

TextField成为焦点时显示的键盘类型。

TextField(
 keyboardType: TextInputType.number,
),

类型是:

  • TextInputType.text(普通完整键盘)
  • TextInputType.number(数字键盘)
  • TextInputType.emailAddress(带有“@”的普通键盘)
  • TextInputType.datetime(带有“/”和“:”的数字键盘)
  • TextInputType.multiline(带有选项以启用有符号和十进制模式的数字键盘)

TextInputAction

更改TextField的textInputAction可以更改键盘本身的操作按钮。

TextField(
 textInputAction: TextInputAction.search,
),

这会导致“完成”按钮被“搜索”按钮替换:

TextCapitalization

TextField提供了一些有关如何使用户输入中的字母大写的选项。

TextCapitalization.sentences : 这是我们期望的正常类型的大写,每个句子的首字母大写。

TextCapitalization.characters:大写句子中的所有字符。

TextCapitalization.words : 将每个单词的首字母大写。

更改TextField中的光标

可以直接从TextField小部件自定义游标。

可以更改角落的光标颜色,宽度和半径。

例如,这里我没有明显的原因制作一个圆形的红色光标。

TextField(
 cursorColor: Colors.red,
 cursorRadius: Radius.circular(16.0),
 cursorWidth: 16.0,
),

控制TextField中的大小和最大长度

TextFields可以控制在其中写入的最大字符数,最大行数并在键入文本时展开。

TextField(
 maxLength: 4,
),

通过设置maxLength属性,将强制执行最大长度,并且默认情况下会将计数器添加到TextField。

github源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Flutter中网络图片加载和缓存的实现

    前言 应用开发中经常会碰到网络图片的加载,通常我们会对图片进行缓存,以便下次加载同一张图片时不用再重新下载,在包含有大量图片的应用中,会大幅提高图片展现速度.提升用户体验且为用户节省流量.Flutter本身提供的Image Widget已经实现了加载网络图片的功能,且具备内存缓存的机制,接下来一起看一下Image的网络图片加载的实现. 重温小部件Image 常用小部件Image中实现了几种构造函数,已经足够我们日常开发中各种场景下创建Image对象使用了. 有参构造函数: Image(Key k

  • Flutter倒计时/计时器的实现代码

    在我们实现某些功能时,可能会有倒计时的需求. 比如发送短信验证码,发送成功后可能要求用户一段时间内不能再次发送,这时候我们就需要进行倒计时,时间到了才允许再次操作. 如下图: 为了实现这样场景的需求,我们需要使用 Timer.periodic . 一.引入Timer对应的库 import 'dart:async'; 二.定义计时变量 class _LoginPageState extends State<LoginPage> { ... Timer _timer; int _countdown

  • Flutter实现页面切换后保持原页面状态的3种方法

    前言: 在Flutter应用中,导航栏切换页面后默认情况下会丢失原页面状态,即每次进入页面时都会重新初始化状态,如果在initState中打印日志,会发现每次进入时都会输出,显然这样增加了额外的开销,并且带来了不好的用户体验. 在正文之前,先看一些常见的App导航,以喜马拉雅FM为例: 它拥有一个固定的底部导航以及首页的顶部导航,可以看到不管是点击底部导航切换页面还是在首页左右侧滑切换页面,之前的页面状态都是始终维持的,下面就具体介绍下如何在flutter中实现类似喜马拉雅的导航效果 第一步:实

  • Flutter 网络请求框架封装详解

     Flutter 请求网络的三种方式 flutter 请求网络的方式有三种,分别是 Dart 原生的网络请求 HttpClient.第三方网络请求 http以及 Flutter 中的 Dio.我们可以比较一下这三种网络请求方式,然后封装为我们方便请求网络的工具类. Dart 原生的网络请求 HttpClient 实现 Dart 获取网络数据的请求,一般我们需要以下几个步骤: step 1: 原生的网络请求时不需要修改 pubspec.yaml 文件的,我们只需要在使用的地方引入所需包就可以了 i

  • Flutter Android端启动白屏问题的解决

    问题描述 Flutter 应用在 Android 端上启动时会有一段很明显的白屏现象,白屏的时长由设备的性能决定,设备性能越差,白屏时间越长. 问题分析 其实启动白屏的问题在Android原生应用上也是一个常见问题,大致是因为从用户点击 Launcher Icon 到应用首页显示之间,Android 系统在完成应用的初始化工作,其流程如下: 在 Flutter Android 端上,白屏的问题会更加严重,因为除了 Android 应用启动耗时外,还增加了 Flutter 初始化耗时. 直到 Fl

  • Flutter中获取屏幕及Widget的宽高示例代码

    前言 我们平时在开发中的过程中通常都会获取屏幕或者 widget 的宽高用来做一些事情,在 Flutter 中,我们有两种方法来获取 widget 的宽高. MediaQuery 一般情况下,我们会使用如下方式去获取 widget 的宽高: final size =MediaQuery.of(context).size; final width =size.width; final height =size.height; 但是如果不注意,这种写法很容易报错,例如下面的写法就会报错: impor

  • Flutter实现底部导航栏效果

    大家最近都在讨论新鲜技术-flutter,小编也在学习中,遇到大家都遇到的问题,底部导航.下面给大家贴出底部导航的编写,主要参考了lime这个项目. 上代码 一.在main.dart文件中 定义APP的基本信息 class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new

  • flutter 输入框组件TextField的实现代码

    TextField 顾名思义文本输入框,类似于iOS中的UITextField和Android中的EditText和Web中的TextInput.主要是为用户提供输入文本提供方便.相信大家在原生客户端上都用过这个功能,就不在做具体介绍了,接下来还是具体介绍下Flutter中TextField的用法. 以下内容已更新到 github TextField的构造方法: const TextField({ Key key, this.controller, //控制器,控制TextField文字 thi

  • Vue.js数字输入框组件使用方法详解

    本文实例为大家分享了Vue.js数字输入框组件的具体实现代码,供大家参考,具体内容如下 效果 入口页 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0

  • vue输入框组件开发过程详解

    本文实例为大家分享了vue输入框组件开发过程的具体代码,供大家参考,具体内容如下 input-number.js function isValueNumber(value) {     return(/(^-?[0-9]+\.{1}\d+$)|(^-?[1-9]*$)|(^-?0{1}$)/).test(value + ''); } Vue.component('input-number',{     template: '\     <div class=input-number>\   

  • Flutter 如何封装文本输入框组件

    UI组件封装的考虑要点 封装一个 UI 组件,通常需要考虑下面这三个点: 接口如何定义:即组件接收什么输入参数来控制组件的外观和行为: 与业务分离:UI 组件应当只负责界面,而不负责业务,具体的业务应当由业务层完成: 简单易用:因为是 UI 组件,要尽可能地简单易用,方便使用者快速上手. 文本输入框接口定义 首先先看一下我们上一篇使用文本框的代码,这里实际上只是调用了一个函数返回新的组件,之所以要这么做是因为用户名.密码使用了成员属性,需要根据不同的成员属性来设置不同的行为,主要有: 文本框装饰

  • Flutter输入框TextField属性及监听事件介绍

    textField用于文本输入,它提供了很多属性: const TextField({ ... TextEditingController controller, FocusNode focusNode, InputDecoration decoration = const InputDecoration(), TextInputType keyboardType, TextInputAction textInputAction, TextStyle style, TextAlign textA

  • Bootstrap输入框组件简单实现代码

    Bootstrap输入框组件的学习代码,供大家参考,具体内容如下 <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE-edge"> <meta name="viewport" content="width=device-width,initial-s

  • Vue数字输入框组件示例代码详解

    数字输入框组件 实现功能:只允许输入数字(包括小数).允许设置初始值.最大值.最小值. 为了方便,这里选用Vue的 cli-service 实现快速原型开发 首先template部分代码 <template> <div class="demo"> <input-number v-model="value" :max="10" :min="0"></input-number> &l

  • Flutter基本组件Basics Widget学习

    目录 1. 概述 2. 常用组件 2.1 Text 2.1.1 TextStyle 2.1.2 TextSpan 2.1.3 DefaultTextStyle 2.1.4 使用字体 2.2 Button 2.2.1 ElevatedButton 2.2.2 TextButton 2.2.3 OutlinedButton 2.2.4 IconButton 2.2.5 带图标的按钮 2.3 图片及Icon 2.3.1 图片 2.3.2 Icon 2.4 单选开关和复选框 2.4.1 属性 2.5 输

  • Bootstrap输入框组件使用详解

    Bootstrap输入框组件的使用方法,具体内容如下 .input-group--设置div为输入框组: .input-group-lg..input-group-sm..input-group-xs--改变输入框组的尺寸: .input-group-addon--在输入框前或后加入额外内容: .input-group-btn--在输入框前或后加入button或button式下拉菜单组件. 代码: <!DOCTYPE html> <html lang="en">

  • vue实现验证码输入框组件

    先来看波完成效果图 需求 输入4位或6位短信验证码,输入完成后收起键盘 实现步骤 第一步 布局排版 <div class="security-code-wrap"> <label for="code"> <ul class="security-code-container"> <li class="field-wrap" v-for="(item, index) in num

随机推荐