Flutter TextField UI 实例 —— 新手礼包

这篇具有很好参考价值的文章主要介绍了Flutter TextField UI 实例 —— 新手礼包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flutter TextField UI 实例 —— 新手礼包

大家好,我是17。

新手礼包一共 3 篇文章,每篇都是描述尽量详细,实例讲解,包会!

  • Flutter Row 实例 —— 新手礼包
  • Flutter TextField UI 实例 —— 新手礼包
  • Flutter TextField 交互实例 —— 新手礼包

本篇介绍了 TextField UI 的常见写法,从TextField的尺寸,border,icon,文本到光标,无所不包!

TextField 的尺寸

默认情况下,TextField 的宽度尽量大,高度包含所有内容并加上 padding。TextField 可以通过 constraints 定义自己的尺寸。

下面的代码规定了 TextField 最大宽度为 200。

TextField(
       decoration: InputDecoration(
          constraints: BoxConstraints(maxWidth: 200),
 ));

让 TextFiled 在高度上也尽量大,设置 expands: true,同时还必须设置 maxLines,minLines 为 null。

TextField(
      maxLines: null,
      minLines: null,
      expands: true,
    );

需要注意在高度上的约束必须是有限的,否则报错。

Column(
      children: [
          TextField(expands: true,)
      ],
    );

这个例子执行会报错。解决办法看下面的代码:

Column(
   children: [
     SizedBox(
         height: 200,
         child: TextField(
           expands: true,
           maxLines: null,
           minLines: null,
         )),
     TextField(
       decoration:
           InputDecoration(constraints: BoxConstraints(maxHeight: 200)),
       expands: true,
       maxLines: null,
       minLines: null,
     ),
     Expanded(
         child: TextField(
       expands: true,
       maxLines: null,
       minLines: null,
     ))
   ],
 );

Column 中有三个 TextField,一个用 SizedBox 包起来,一个用 InputDecoration 自带的 constraints 限定,一个用 Expanded 包起来,都是可以的,都可以让 TextField 在高度上的约束是有限的。

除了 SizedBox,很多 widget 都有修改约束的能力,比如 Container,ConstrainedBox 等。

Expanded 的解释可以看这篇 Flutter 弹性布局的基石: Flex 和 Flexible。

默认展示

第一个示例给出全部代码,贴到 main.dart 就能运行。后面的只给出 TextField 相关。

Flutter TextField UI 实例 —— 新手礼包
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

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

  
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: Center(child: SizedBox(width: 300, child: MyWidget()))));
  }
}

class MyWidget extends StatefulWidget {
  const MyWidget({super.key});

  
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  var controller = TextEditingController(text: "IAM17");
  
  void dispose() {
    controller.dispose();
    super.dispose();
  } 
  
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        TextField(),
        SizedBox(
          height: 20,
        ),
        TextField(),
      ],
    );
  }
}

没加 Const 关键字,因为反复修改的时候可能得一会删,一会加。发布代码的时候还是应该加上的。

controller 后面会用到

用两个 TextField 是为了方便查看 Focus 的效果。上面的为 正常状态的 TextField,下面的为 focus 状态的 TextField。默认配置正常状态下的 TextField 是一条灰线,有焦点的时候变成蓝色。接下来,我们把他变成想要的样子。

去掉下面的横线

TextField(  
    decoration: InputDecoration(  
        border: InputBorder.none,  
    ),  
),

下面的横线其实就是 border,去掉后,现在只剩下一个光标了。想怎样装扮可以用其它 widget,比如可以用 Container 包起来,自定义 border,也可以用 Row 包起来,加各种图标。这是一个方案,如果你对 TextField 不熟悉,可以这样做来快速完成任务,但实际上,TextField 直接就可以完成大多数装扮,还是用优先用 TextField 自带的装扮为好,因为这样可以少写很多代码。

实际上,在设置 border: InputBorder.none后还是有 padding 的。为了彻底消除 decoration 的影响,可以把它设置为 null。

TextField(
     decoration: null,
);

加边框

Flutter TextField UI 实例 —— 新手礼包
TextField(
      decoration: InputDecoration(
        border: OutlineInputBorder(
            gapPadding: 4,
            borderSide: BorderSide(
                color: Colors.green, width: 2, style: BorderStyle.solid),
            borderRadius: BorderRadius.circular(10)),
      ),
    )

我们给 TextField 加上了宽度为 2,圆角为 10 的边框。

  • width 是用来定义边框的宽度的,可以用小数,比如 1.5
  • style 是线框的样式,目前只有一种可选,就是BorderStyle.solid
  • color 是线框的颜色
  • borderRadius 可以定线框的圆角。
  • gapPadding 定义 labelText 左右的 Padding。

前面几个都好理解,gapPadding 我再放一个图就明白了。

gapPadding:4 修改为 100 看下效果。

Flutter TextField UI 实例 —— 新手礼包

gapPadding 是作用于 LabelText 的,为 LabelText 的左右添加空白。虽然在视觉上好像是只给右边加了空白,其实左边也加了,只是左边没那么长的线框可以减,看起来好像是少了一小段,其实左边的上边框已经完全减掉了。

label 也可以拆开写,效果是一样的。

 labelText:  'IAM17',
 labelStyle: TextStyle(color:Color(0xFFC45F84),fontSize: 24),

可能你会想到,要用虚线边框怎么办,需要自定义 decration,本文就不展开说了。

如果你已经运行了示例代码,会发现 width,color 没有生效?确实是没有生效,线框的颜色还是默认的灰色,宽度还是 1。

定义线框的颜色和宽度

定义线框的宽度和颜色不能用 border。InputDecoration 按状态还为我们准备了五种 border,下面示范的是最常用的两种,正常状态下的 enabledBorder,和 focus 状态下的 focusedBorder。

Flutter TextField UI 实例 —— 新手礼包
TextField(
       decoration: InputDecoration(
         enabledBorder: OutlineInputBorder(
           borderRadius: BorderRadius.circular(5),
           borderSide: BorderSide(
             color: Colors.green,
             width: 1.0,
           ),
         ),
         focusedBorder: OutlineInputBorder(
           borderRadius: BorderRadius.circular(30),
           borderSide: BorderSide(
             color: Color(0xFFC45F84),
             width: 2.0,
           ),
         ),
       ),
     )

第三种是 disabledBorder,看效果需要 enabled: false 禁用 TextField。禁用后会展示灰色 border,无法 focus。

Flutter TextField UI 实例 —— 新手礼包
TextField(
    decoration: InputDecoration(
      enabled: false,
      disabledBorder: OutlineInputBorder(
        borderRadius: BorderRadius.circular(5),
        borderSide: BorderSide(
          color: Colors.grey,
          width: 1.0,
        ),
      ),    
    ),
);

第四种第五种是 error 相关,errorBorder 与 focusedErrorBorder。 给 errorText 赋值,就会触发 TextField 的错误状态。

Flutter TextField UI 实例 —— 新手礼包
 TextField(
     decoration: InputDecoration(
       errorBorder: OutlineInputBorder(
         borderSide: BorderSide(
           color: Color.fromARGB(255, 157, 23, 13),
           width: 1.0,
         ),
       ),
       errorText: '出错了!',
       focusedErrorBorder: OutlineInputBorder(
         borderRadius: BorderRadius.circular(5),
         borderSide: BorderSide(
           color: Colors.red,
           width: 2.0,
         ),
       ),
     ),
   )

文本样式,背景色

Flutter TextField UI 实例 —— 新手礼包
 TextField(
      controller: controller,
      style: TextStyle(color: Color(0xFFC45F84), fontSize: 24),
      decoration: InputDecoration(
          filled: true, fillColor: Color.fromARGB(255, 192, 241, 218)));

controller 在最开始的代码中已经给出来了var controller = TextEditingController(text: "IAM17"); 现在我们用 controller 显示初始文本。

filled 默认为 false,fillColor 无效,要设置背景色,需要设置 filled: true,然后再设置 fillColor。

正文文本的样式用 style。可以用 textAlign 控制文本的摆放。我们可以把文本摆放在中间。

Flutter TextField UI 实例 —— 新手礼包
TextField(
        textAlign: TextAlign.center,
        controller: controller,
        style: TextStyle(color: Color(0xFFC45F84), fontSize: 24),
        decoration: InputDecoration(
            filled: true, fillColor: Color.fromARGB(255, 192, 241, 218)))
  ]));

除了可以摆放在中间,还可以摆在末尾,一共有 5 个值可选,具体可以查看 TextAlign

不够生动?用 icon 和 text 来装扮吧!

Flutter TextField UI 实例 —— 新手礼包
 TextField(
       controller: controller,
       style: TextStyle(color: Color(0xFFC45F84), fontSize: 24),
       decoration: InputDecoration(
         icon: Icon(Icons.search),
         prefixIcon: Icon(Icons.account_box),
         prefix: Text('你是谁?',
             style: TextStyle(
                 color: Color.fromARGB(255, 25, 73, 6), fontSize: 20)),
         suffixIcon: Icon(Icons.star),
         suffix: Text('我们见过的',
             style: TextStyle(
                 color: Color.fromARGB(255, 14, 92, 99), fontSize: 20)),
       ))

内容有点多,把最外面的 Container 的宽度放大到 400。

一共有五个位置用来装饰。最前面的是 icon,在 border 的外面。接下来是 prefixIcon,然后是正文,最后是 suffix 和 subffixIcon。

这个五个位置虽然从名字上来看是 Icon 和 Text,但实际上只要是 Widget 都可以!但最好是用 Icon,Text,因为如果用其它 Widget,可能享受不到 Theme 的福利了。

prefix,suffix 也可以用两个字段替代。

prefixText: '你是谁?',
prefixStyle: TextStyle( color: Color.fromARGB(255, 25, 73, 6), fontSize: 20),
suffixText: '我们见过的',
suffixStyle: TextStyle( color: Color.fromARGB(255, 14, 92, 99), fontSize: 20),

扩写和缩写只能采用一种,同时存在会报错!

自定义 Icon 的颜色

当前 Icon 的 color 都是默认的,如何修改 Icon 的颜色呢?可能你第一时间想到这样修改:

icon: Icon(Icons.search,color:Colors.green),

你一定很高兴,it work! 现在 TextField 的正常状态和 foucs 状态的颜色都是 green。那么,如果想让 TextField 的 focus 状态的 icon 颜色是红色,怎么办?

思考中…

好像很棘手,其实 Flutter 已经为我们设计好了如何修改 Icon 的颜色,用 Theme!

首先定义一个 MaterialStateColor。

class IconColor extends MaterialStateColor {
  const IconColor() : super(_defaultColor);
  //绿色
  static const int _defaultColor = 0xff00ff00;
  //红色
  static const int _focusColor = 0xffff0000;

  
  Color resolve(Set<MaterialState> states) {
    if (states.contains(MaterialState.focused)) {
      return const Color(_focusColor);
    }
    return const Color(_defaultColor);
  }
}

然后加入到 Theme 中,我们需要修改一下之前的代码。

MaterialApp(
   theme: ThemeData(
      inputDecorationTheme: InputDecorationTheme(
         iconColor: IconColor()
       ),),
   home: Scaffold(
       body: Center(child: SizedBox(width: 400, child: MyWidget()))));

查看效果默认的时候 icon 是绿色的,focus 的时候是红色的。

Flutter TextField UI 实例 —— 新手礼包

如果你觉得定义一个类太麻烦,也可以用 resolveWith 方法

MaterialApp(
    theme: ThemeData(
      inputDecorationTheme: InputDecorationTheme(iconColor:
          MaterialStateColor.resolveWith((Set<MaterialState> states) {
        if (states.contains(MaterialState.focused)) {
          return Colors.red;
        }
        return Colors.green;
      })),
    ),
    home: Scaffold(
        body: Center(child: SizedBox(width: 300, child: MyWidget()))));

前面说的 border, 也可以通过 Theme 设置。这样就不用每个 TextField 都定一遍了!

inputDecorationTheme: InputDecorationTheme(
         enabledBorder: OutlineInputBorder(borderSide: BorderSide(color: Colors.green)),
         focusedBorder: OutlineInputBorder(borderSide: BorderSide(color: Colors.red))
 )

inputDecorationTheme 可以设置很多内容。Theme 相当于是 css 中的样式表。Theme 如果写在 MaterialApp 中,就相当于是全局样式表了,写在其它地方相当于局部样式表。子级的 Theme 的优先级大于父级的 Theme。写在 Widget 里的相当于 Style,优先级最高。

isDense

上面是默认 isDense:false 的效果,下面是 isDense:true 的效果,就是icon变小了一些。

Flutter TextField UI 实例 —— 新手礼包
InputDecoration(
     isDense: true,
     icon: Icon(Icons.search),
     prefixIcon: Icon(Icons.account_box),
     prefix: Text('你是谁?',
         style: TextStyle(
             color: Color.fromARGB(255, 25, 73, 6), fontSize: 20)),
     suffixIcon: Icon(Icons.star),
     suffix: Text('我们见过的',
         style: TextStyle(
             color: Color.fromARGB(255, 14, 92, 99), fontSize: 20)),
   );

hint text 与 helper text

灰色的是 hintText,和 html 中 placeholder 差不多。绿色的是 helper Text,显示在左下角。

Flutter TextField UI 实例 —— 新手礼包
TextField(
   decoration: InputDecoration(
     hintText: 'IAM17',
     hintStyle: TextStyle(color: Colors.black54),
     hintMaxLines: 1,
     helperText: '我们见过的',
     helperStyle: TextStyle(color: Color.fromARGB(255, 52, 116, 7)),
     helperMaxLines: 1,
   ))

已经包含 hint text 与 helper text 的所有属性了,比较好理解,就不再解释了。要注意的一点是:focus 对这两个 text 的样式没有影响。error 状态 hint text 没有变化,helper text 被 errorText 取代。

label text

同时有 label text 和 hint text 的时候,正常状态下会优先显示 labelText。在 focus 状态下,labelText 缩小到左上角,hint text 显示出来。

Flutter TextField UI 实例 —— 新手礼包

label text 远没有这么简单,除 labelText,labelStyle,还有几个属性需要了解。

floatingLabelStyle 定义 focus 状态下 label 显示在左上角的样式。正常状态下 label text 的颜色用 labelStyle 设置为灰色,浮到左上角后可以用 floatingLabelStyle 设置为绿色。

Flutter TextField UI 实例 —— 新手礼包
TextField(
    decoration: InputDecoration(
      labelText: '你是谁',
      labelStyle: TextStyle(color: Colors.grey),
      floatingLabelStyle: TextStyle(color: Colors.green),
    ))
)

floatingLabelAlignment 可以让左上角的 label 显示在中间。(只有 start 和 center 两个选项)

Flutter TextField UI 实例 —— 新手礼包
TextField(
   decoration: InputDecoration(
     labelText: '你是谁',
     labelStyle: TextStyle(color: Color.fromARGB(255, 194, 52, 101)),
     floatingLabelStyle: TextStyle(color: Colors.blue),
     floatingLabelAlignment: FloatingLabelAlignment.center
   ));

floatingLabelBehavior 控制 label 的行为,有三个选项

  • FloatingLabelBehavior.auto 默认。正常状态覆盖 hint,focus 状态上浮。
  • FloatingLabelBehavior.always 正常状态 和 focus 状态 都上浮。hint 正常显示。
  • FloatingLabelBehavior.never 正常状态覆盖 hint,focus 状态不上浮。这时就和 hint 并不多了,唯一不同的是 focus 的时候 hint 不消失,label 消失。

padding

默认情况下,在正文的四周是有 padding 的。

Flutter TextField UI 实例 —— 新手礼包

contentPadding: EdgeInsets.zero 可以去掉左右的 padding。

Flutter TextField UI 实例 —— 新手礼包
decoration: InputDecoration(
    contentPadding: EdgeInsets.zero,
    filled: true,
    fillColor: Color.fromARGB(255, 192, 241, 218)))

去掉上下的 padding 要用到一个属性,isCollapsed可以把上下左右的 padding 都去掉。

Flutter TextField UI 实例 —— 新手礼包
InputDecoration(
    isCollapsed: true,
    filled: true,
    fillColor: Color.fromARGB(255, 192, 241, 218))

也可以用InputDecoration.collapsed,但要求必须指定 hintText,不允许再指定 labelText,errorText,icon。

InputDecoration.collapsed(
   hintText: "你是谁",
   filled: true,
   fillColor: Color.fromARGB(255, 192, 241, 218))

直接用 isCollapsed: true,可以指定 labelText,errorText,icon,但 UI 上可能不大理想,所以如果想去掉所有 padding,优先用 InputDecoration.collapsed

自定义光标

可以自定义光标的宽度,radius,和颜色。

Flutter TextField UI 实例 —— 新手礼包
TextField(
     cursorWidth: 16.0,
     cursorRadius: Radius.circular(18.0),
     cursorColor: Color(0xFFC45F84),
   ),

Flutter TextField UI 常见写法到这里就结束了,谢谢观看。

欢迎观看下一篇 Flutter TextField 交互实例 —— 新手礼包文章来源地址https://www.toymoban.com/news/detail-401693.html

到了这里,关于Flutter TextField UI 实例 —— 新手礼包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从新手到Flutter架构师,一篇就够!Flutter-最全开源项目(UI、导航、网络、导航、音视频---)

    pub.dartlang.org/packages/fl… 最好用的路由导航框架。功能:简单的路线导航;函数处理程序(映射到函数而不是路径);通配符参数匹配;查询字符串参数解析;内置常用转换;简单的定制转换创建。 http pub.dartlang.org/packages/ht… github.com/dart-lang/h… http是使用Dart原生编写的网络

    2024年04月17日
    浏览(53)
  • flutter 表单组件TextField、TextFormField使用

    属性 说明 controller 控制器,可以控制 textField 的输入内容,也可以监听 textField 改变 focusNode 焦点控制, decoration textField 装饰 keyboardType TextInputType,键盘类型 textCapitalization 大小写,默认为 TextCapitalization.none style 字体样式 strutStyle 字体的布局样式 textAlign 文字对齐方式,默认为

    2024年02月03日
    浏览(45)
  • Flutter TextField设置背景色和圆角

    这是一个很常见的登录页面,自然想到了Flutter的表单组件 Form。  想使用 Form  组件,就要修改 TextFormField 的样式了。 TextFormField 是 TextField 的一个包装类,除了 FormField 定义的属性之外,它还包括 TextField 的属性。 TextField的decoration 属性可以用于控制 TextField 的外观显示,如提

    2023年04月18日
    浏览(81)
  • Flutter TextField 组件的属性、监听、赋值等详细说明

    ①获取文本框内容: _use.text.toString(); ②给文本框赋值,有两种写法: String  mUserId=\\\"123\\\"; ③文本框的监听: _use .addListener(() {   print(\\\"你输入的内容为:\\\"+ mUserId );   }); return TextField( //改变事件 onChanged: (str) { print(\\\"你改变的内容为:\\\"+ str ); },); //使用 return TextField( focusNode: _focus

    2023年04月08日
    浏览(48)
  • flutter聊天界面-TextField输入框buildTextSpan实现@功能展示高亮功能

    flutter聊天界面-TextField输入框buildTextSpan实现@功能展示高亮功能 最近有位朋友讨论的时候,提到了输入框的高亮展示。在flutter TextField中需要插入特殊样式的标签,比如:“请 @张三 回答一下”,这一串字符在TextField中输入,当输入@时 弹出好友列表选择,然后将 “@张三”高

    2024年02月07日
    浏览(52)
  • 如何解决在Flutter中使用TextField输入框输入中文时可能会出现键盘输入不了中文的问题。

    在Flutter中使用TextField输入框输入中文时可能会出现键盘输入不了中文的问题。 解决方法有以下几种: 在TextField中指定输入类型为TextInputType.text TextField(   keyboardType: TextInputType.text,   ... ) 2.在TextField中指定输入工具为中文输入法: TextField(   inputFormatters: [WhitelistingTextInputFor

    2023年04月22日
    浏览(45)
  • 【Flutter 问题系列第 80 篇】TextField 输入框组件限制可输入的最大长度后,输入的内容中包含表情符号时,获取输入的内容数还是会超出限制的问题

    这是【Flutter 问题系列第 80 篇】,如果觉得有用的话,欢迎关注专栏。 博文当前所用 Flutter SDK:3.10.5、Dart SDK:3.0.5 一:问题描述 在输入用户名称、简介等内容时,一般我们都会限制输入框内最大可输入数(通过 TextField 组件的 maxLength 属性),如下图限制简介最多10个字 正常

    2024年01月21日
    浏览(59)
  • 【ChatGPT】开源软件:ChatALL —— 我是 GitHub 榜一!(PS: 其实,小编本地 build run 了一下,就是一个组装 Chat UI ……)

    给第一次听说 ChatALL 的朋友介绍下它吧。很简单,它就是个 能让你同时和 ChatGPT、Bing Chat、Bard、文心一言、讯飞星火、Claude、HuggingChat、Alpaca, Vincuna、MOSS、ChatGLM 聊天的工具,帮你快速找到最靠谱的答案。 Concurrently chat with ChatGPT, Bing Chat, bard, Alpaca, Vincuna, Claude, ChatGLM, MOSS,

    2024年02月07日
    浏览(60)
  • 新手小白学习SWAT模型【建模方法、实例应用、高级进阶】

    目录 第一部分:SWAT模型实践部分 第二部分:SWAT模型【进阶部分】 更多推荐 【专家】: 刘老师【副教授】,北京重点高校资深专家,和美国SWAT软件开发方长期合作,拥有丰富的科研及工程技术经验,长期从事流域面源污染模拟及控制等领域的研究,具有资深的技术底蕴和

    2024年02月15日
    浏览(61)
  • 界面开发框架Qt新手入门教程:Dir视图使用实例

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 本示例演示了树形视图的用

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包