flutter文本输入框使用

news2024/11/25 12:32:56

在Flutter中,实现输入框一般使用TextField,通过设置它的属性给输入框和内部文字设置不同的样式。

Flutter 输入框实现简单例子

import 'package:flutter/material.dart';

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("My EditText"),
      ),
      //body 是否延伸到底部控件
      extendBody: true,
      body: Column(
        children: [
          //Spacer创建一个可调整的空间隔,可用于调整Flex容器(如行或列)中窗口小部件之间的间距。
          const Spacer(),
          const Spacer(),
          Container(
              //通常用于给一个盒子的四边设置边距,用这个对象可以设置内边距。
              margin: const EdgeInsets.all(10),
              child: const Center(
                child: TextField(
                  minLines: 1, //必须填1,输入内容才可居中,其他默认是左上对齐
                  maxLines: 10, //最多行数,大于1即可
                  decoration: InputDecoration(
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(10)),
                        //圆角
                        borderSide: BorderSide(width: 1, color: Colors.yellow)),
                    focusedBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(10)),
                        //圆角
                        borderSide: BorderSide(width: 1, color: Colors.yellow)),
                    enabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(10)),
                        //圆角
                        borderSide: BorderSide(width: 1, color: Colors.yellow)),
                    errorBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(10)),
                        //圆角
                        borderSide: BorderSide(width: 1, color: Colors.yellow)),
                    disabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(10)),
                        //圆角
                        borderSide: BorderSide(width: 1, color: Colors.yellow)),
                    fillColor: Colors.white,
                    filled: true,
                    contentPadding: const EdgeInsets.all(5),
                  ),
                ),
              ))
        ],
      ),
    );
  }
}

下述代码可以抽出来: 

OutlineInputBorder(
      borderRadius: BorderRadius.all(Radius.circular(10)), //圆角
      borderSide: BorderSide(width: 1, color: Colors.yellow))

static const border = OutlineInputBorder(
      borderRadius: BorderRadius.all(Radius.circular(10)), //圆角
      borderSide: BorderSide(width: 1, color: Colors.yellow));
class MyEditPage extends StatelessWidget {
  const MyEditPage({super.key});

  static const border = OutlineInputBorder(
      borderRadius: BorderRadius.all(Radius.circular(10)), //圆角
      borderSide: BorderSide(width: 1, color: Colors.yellow));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("My EditText"),
      ),
      //body 是否延伸到底部控件
      extendBody: true,
      body: Column(
        children: [
          //Spacer创建一个可调整的空间隔,可用于调整Flex容器(如行或列)中窗口小部件之间的间距。
          const Spacer(),
          const Spacer(),
          Container(
              //通常用于给一个盒子的四边设置边距,用这个对象可以设置内边距。
              margin: const EdgeInsets.all(10),
              child: const Center(
                child: TextField(
                  minLines: 1, //必须填1,输入内容才可居中,其他默认是左上对齐
                  maxLines: 10, //最多行数,大于1即可
                  decoration: InputDecoration(
                    border: border,
                    focusedBorder: border,
                    enabledBorder: border,
                    errorBorder: border,
                    disabledBorder: border,
                    fillColor: Colors.white,
                    filled: true,
                    contentPadding: const EdgeInsets.all(5),
                  ),
                ),
              ))
        ],
      ),
    );
  }

  OutlineInputBorder getBorder() {
    OutlineInputBorder outlineInputBorder = const OutlineInputBorder(
        borderRadius: BorderRadius.all(Radius.circular(10)), //圆角
        borderSide: BorderSide(width: 1, color: Colors.blue));
    return outlineInputBorder;
  }
}

TextField介绍

TextField 是 Material Design 文本字段。它允许用户使用硬件键盘或屏幕键盘输入文本。每当用户更改TextField 中的文本时,TextField 都会调用 onChanged 回调。如果用户完成在TextField 中的输入(例如,通过按下软键盘上的按钮),TextField 将调用 onSubmitted 回调。

  const TextField({
    super.key,
    this.controller,
    this.focusNode,
    this.undoController,
    this.decoration = const InputDecoration(),
    TextInputType? keyboardType,
    this.textInputAction,
    this.textCapitalization = TextCapitalization.none,
    this.style,
    this.strutStyle,
    this.textAlign = TextAlign.start,
    this.textAlignVertical,
    this.textDirection,
    this.readOnly = false,
    @Deprecated(
      'Use `contextMenuBuilder` instead. '
      'This feature was deprecated after v3.3.0-0.5.pre.',
    )
    this.toolbarOptions,
    this.showCursor,
    this.autofocus = false,
    this.statesController,
    this.obscuringCharacter = '•',
    this.obscureText = false,
    this.autocorrect = true,
    SmartDashesType? smartDashesType,
    SmartQuotesType? smartQuotesType,
    this.enableSuggestions = true,
    this.maxLines = 1,
    this.minLines,
    this.expands = false,
    this.maxLength,
    this.maxLengthEnforcement,
    this.onChanged,
    this.onEditingComplete,
    this.onSubmitted,
    this.onAppPrivateCommand,
    this.inputFormatters,
    this.enabled,
    this.ignorePointers,
    this.cursorWidth = 2.0,
    this.cursorHeight,
    this.cursorRadius,
    this.cursorOpacityAnimates,
    this.cursorColor,
    this.cursorErrorColor,
    this.selectionHeightStyle = ui.BoxHeightStyle.tight,
    this.selectionWidthStyle = ui.BoxWidthStyle.tight,
    this.keyboardAppearance,
    this.scrollPadding = const EdgeInsets.all(20.0),
    this.dragStartBehavior = DragStartBehavior.start,
    bool? enableInteractiveSelection,
    this.selectionControls,
    this.onTap,
    this.onTapAlwaysCalled = false,
    this.onTapOutside,
    this.mouseCursor,
    this.buildCounter,
    this.scrollController,
    this.scrollPhysics,
    this.autofillHints = const <String>[],
    this.contentInsertionConfiguration,
    this.clipBehavior = Clip.hardEdge,
    this.restorationId,
    this.scribbleEnabled = true,
    this.enableIMEPersonalizedLearning = true,
    this.contextMenuBuilder = _defaultContextMenuBuilder,
    this.canRequestFocus = true,
    this.spellCheckConfiguration,
    this.magnifierConfiguration,
  }) 

获取TextField中信息

1.使用onChanged回调方法,将TextField当前的值保存在变量中。

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

  static const border = OutlineInputBorder(
      borderRadius: BorderRadius.all(Radius.circular(10)), //圆角
      borderSide: BorderSide(width: 1, color: Colors.yellow));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("My EditText"),
      ),
      //body 是否延伸到底部控件
      extendBody: true,
      body: Column(
        children: [
          //Spacer创建一个可调整的空间隔,可用于调整Flex容器(如行或列)中窗口小部件之间的间距。
          const Spacer(),
          const Spacer(),
          Container(
              //通常用于给一个盒子的四边设置边距,用这个对象可以设置内边距。
              margin: const EdgeInsets.all(10),
              child:  Center(
                child: TextField(
                  onChanged: (String value) {
                    print("value:"+value);
                  },
                  minLines: 1, //必须填1,输入内容才可居中,其他默认是左上对齐
                  maxLines: 10, //最多行数,大于1即可
                  decoration: InputDecoration(
                    border: border,
                    focusedBorder: border,
                    enabledBorder: border,
                    errorBorder: border,
                    disabledBorder: border,
                    fillColor: Colors.white,
                    filled: true,
                    contentPadding: const EdgeInsets.all(5),
                  ),
                ),
              ))
        ],
      ),
    );
  }

  OutlineInputBorder getBorder() {
    OutlineInputBorder outlineInputBorder = const OutlineInputBorder(
        borderRadius: BorderRadius.all(Radius.circular(10)), //圆角
        borderSide: BorderSide(width: 1, color: Colors.blue));
    return outlineInputBorder;
  }
}

2024-09-03 11:45:37.758  5798-5832  flutter                        I  value:1
2024-09-03 11:45:37.994  5798-5832  flutter                        I  value:11
2024-09-03 11:45:38.437  5798-5832  flutter                        I  value:115
2024-09-03 11:45:38.668  5798-5832  flutter                        I  value:1155
2024-09-03 11:45:38.867  5798-5832  flutter                        I  value:11555
2024-09-03 11:45:39.066  5798-5832  flutter                        I  value:115555

 2.TextEditingController 控制器监听和控制TextField的文本

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

class TextFieldPageState extends State {
  //文本框输入控制器
  TextEditingController controller = TextEditingController();

  //控制TextField焦点的获取与关闭
  FocusNode focusNode = FocusNode();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("TextField 标题"),
        actions: <Widget>[
          FloatingActionButton(
            child: Text(
              "Click",
              style: TextStyle(color: Colors.white),
            ),
            onPressed: () {
              //获取文本输入框内容
              String inputText = controller.text;
              print("文本输入框内容是:$inputText");
            },
          )
        ],
      ),
      body: Center(
        child: SizedBox(
          width: 400,
          height: 110,
          child: Container(
            color: Colors.white24,
            padding: EdgeInsets.all(10),
            alignment: Alignment(0, 0),
            child: TextField(
              controller: controller,
              onChanged: (value) {
                print("onChanged:$value");
              },
            ),
          ),
        ),
      ),
    );
  }

  @override
  void initState() {
    super.initState();

    String preText = "";
    //控制器,初始化的时候光标显示在文字后面
    controller = TextEditingController.fromValue(TextEditingValue(
        //用来设置初始化显示
        text: preText,
        selection: TextSelection.fromPosition(
            //用来设置文本的位置
            TextPosition(
                affinity: TextAffinity.downstream, offset: preText.length))));

    // 添加监听 当TextFeild 中内容发生变化 或者 焦点变动 都会触发回调
    // onChanged 当TextFeild文本发生改变时才会回调
    controller.addListener(() {
      String currentStr = controller.text;
      print("使用 Controller 监听 $currentStr");
    });
  }
}

class TextFieldHome extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return TextFieldPageState();
  }
}

2024-09-03 14:32:20.094 23776-23959 flutter                        I  使用 Controller 监听 1
2024-09-03 14:32:20.280 23776-23959 flutter                        I  使用 Controller 监听 15
2024-09-03 14:32:20.449 23776-23959 flutter                        I  使用 Controller 监听 155

3.TextField回调onEditingComplete & onSubmitted

 onEditingComplete: () {
                print("onEditingComplete:" "编辑完成——>" + controller.text);
              }

输入123点击回车: 

2024-09-03 14:45:45.778 28502-28537 flutter                 I  onEditingComplete:编辑完成——>123

   onSubmitted: (value) {
                print("onSubmitted:$value");
              }
2024-09-03 14:45:45.779 28502-28537 flutter                   I  onSubmitted:123
2024-09-03 14:45:49.374 28502-28537 flutter                   I  onSubmitted:123
2024-09-03 14:49:16.016 28502-28537 flutter                   I  onSubmitted:123

4.TextField焦点

TextField获得焦点表示TextField被激活并且任何来自键盘的输入都会被录入到获得焦点的TextField内。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法训练第30天|46. 携带研究材料(01背包问题)|416. 分割等和子集

先讲一下01背包问题&#xff1a; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 这道题目如果使用暴力解法&#xff0c;即回溯法来做的…

Transformer简明笔记:文本翻译

Bert和gpt都是基于transformer的&#xff0c;在此之前流行的是rnn&#xff0c;复杂度有限且效率不高&#xff0c;容易受到文本长度的限制。 项目地址:https://github.com/lansinuote/Transformer_Example b站视频&#xff1a;https://www.bilibili.com/video/BV19Y411b7qx?p9&…

Java项目: 基于SpringBoot+mysql旅游网站管理系统分前后台(含源码+数据库+开题报告+PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql旅游网站管理系统分前后台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作…

【java入门】JDK的下载安装与配置,最新最详细教程!

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主、华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f970; &#…

创意微型学生机床工具——金属车床

劳技课程是实施劳动与技术教育的主要途径&#xff0c;具有基础性、实践性、综合性和创新性等特点。它不仅是国家课程、地方课程和校本课程的统一体&#xff0c;还是基础教育课程体系中的重要一环。 劳技课程强调学生的动手操作能力和实践体验&#xff0c;通过具体的技术活动和劳…

IP的SSL证书的申请及配置方式

随着互联网技术的发展&#xff0c;数据安全变得越来越重要。HTTPS协议因其提供的加密传输能力而成为现代Web通信的标准。实现HTTPS的关键组件之一就是SSL/TLS证书&#xff0c;它为网站提供了一层保护&#xff0c;确保客户端与服务器之间的数据传输是加密的。本文将指导您如何为…

NSSCTF刷题

[NISACTF 2022]checkin 1.在选中nisactf的时候&#xff0c;注释里面的内容也被标记了 2.复制到010editer中发现存在不可见的字符 3.我们选择实际的参名和字符串&#xff0c;并转为url编码格式 4.得到最后的payload&#xff0c;传参得到flag ahahahahajitanglailo&%E2%80%…

当敏捷开发遇上AI

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【ESP32 IDF】WS2812B灯驱动

WS2812B灯驱动 1. 简单描述2. 驱动过程3.主函数添加驱动程序 1. 简单描述 开发环境为 IDF5.2.2采用乐鑫官方组件库 组件库地址 &#xff1a; https://components.espressif.com/components/espressif/led_strip/versions/2.5.5 2. 驱动过程 复制led_strip组件命令 在自己项目…

密钥分发与公钥认证:保障网络通信的安全

在网络通信中&#xff0c;密钥的安全分发和公钥的有效认证是确保系统安全的关键。本文将为基础小白介绍密钥分发与公钥认证的基本概念和实际应用&#xff0c;帮助大家更好地理解这些技术如何保障我们的网络通信安全。 1. 密钥分发与公钥认证的背景 由于密码算法是公开的&…

数仓基础(九):各大公司实时数仓实践

文章目录 各大公司实时数仓实践 一、网易实时数仓实践 二、汽车之家实时数仓实践 三、顺丰实时数仓实践 四、​​​​​​​腾讯实时数仓实践 五、​​​​​​​​​​​​​​滴滴实时数仓实践 ​​​​​​​​​​​​​​各大公司实时数仓实践 一、网易实时数仓实践…

OpenHarmony编译开发:hiperf应用优化调试命令行工具实践

简介 hiperf 是 OpenHarmony 为开发人员提供的用于调试的命令行工具&#xff0c;用于抓取特定程序或者系统的性能数据,类似内核的 perf 工具&#xff0c;该工具支持在 Windows/Linux/Mac 等操作系统上运行。 架构 目录 /developtools/hiperf ├── demo # demo 程序 │ …

单片机-串口通信(二)

目录 一、串口概念 1.相关概念&#xff1a; 按数据传输方式分类&#xff1a; 按时钟分类 二、STM32F103ZET6中串口 USART特性&#xff1a; NRZ数据格式&#xff1a; 三、配置串口通信 查看硬件原理图 软件配置流程 USART相关的寄存器 新建my_usart1.c和my_usart1.h …

Python 中 9 种关键文件类型你了解几个?

当你遇到名称以 .ipynb、.pyi、.pyc 等结尾的 Python 文件时&#xff0c;你是否会感到困惑&#xff1f; 你想知道所有这些文件类型之间的区别吗&#xff1f;今天就和大家一起了解所有这些 Python 文件类型。&#x1f642; .py文件&#xff1a;标准 Python 源代码 不用多说&a…

C++:this指针详解

目录 一、this指针 二、C和C语言实现Stack对比 一、this指针 • Date类中有 Init 与 Print 两个成员函数&#xff0c;函数体中没有关于不同对象的区分&#xff0c;那当d1调用Init和 Print函数时&#xff0c;该函数是如何知道应该访问的是d1对象还是d2对象呢&#xff1f;那么这…

【蔡英丽医生】颈动脉斑块:认识它,预防它,应对它

在我们日常的健康检查中&#xff0c;颈动脉斑块这个词可能会不经意间跃入眼帘&#xff0c;尤其是对于40岁以上的朋友们来说&#xff0c;它的出现率更是居高不下。据调查数据显示&#xff0c;我国40岁以上人群中&#xff0c;颈动脉斑块的检出率超过40%&#xff0c;而60岁以上的人…

【UE5】控件蓝图——树视图(TreeView)的基本使用

目录 前言 效果 步骤 一、显示根节点 二、显示子节点 前言 我们在视口中添加1个方块&#xff0c;2个球体&#xff0c;5个圆柱 它们在大纲视图中的层级关系如下&#xff0c;那么如何将这种层级关系显示在树视图中是本篇文章要解决的问题。 效果 步骤 一、显示根节点 1…

【靶场】Pikachu—XSS Cross-Site Scripting(前五关)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【靶场】Pikachu—XSS Cross-Site Scripting&#xff08;前五关&#xff09; 第一关 反射型xss(get)第二关 反射型xss(post)第三关…

WeSiGJ的系列文章目录

文章目录 Cbasic 面试基础知识系列 23种 设计模式[创建式模式Creative Mode][结构型模式Structural pattern][行为模式Behavioral patterns] 关于作者支持作者 C basic 面试基础知识系列 abstractassertbit_fieldbit_operationCFeaturesconstdecltype 多态double_colon 冒号e…

宝塔官网下载地址

宝塔官网下载地址