Flutter问题记录 - TextField组件多行提示文本显示不全

news/2024/12/13 0:31:20/

文章目录

  • 前言
  • 开发环境
  • 问题描述
  • 问题分析
  • 解决方案
  • 最后


前言

梳理Flutter项目的过程中发现还有一些遗留的TODO没处理,其中有一个和TextField组件相关。

开发环境

  • Flutter: 3.10.1
  • Dart: 3.0.1

问题描述

TextField组件设置maxLines: null不限制行数,同时设置多行提示文本hintText

TextField(maxLines: null,decoration: InputDecoration(hintText: 'Text that suggests what sort of input the field accepts.' * 5,border: InputBorder.none,),
);

提示文本显示不全只显示一行:

screenshot1

问题分析

首先确定是不是因为没有设置hintMaxLines属性的原因导致的问题:

TextField(maxLines: null,decoration: InputDecoration(hintText: 'Text that suggests what sort of input the field accepts.' * 5,hintMaxLines: null,border: InputBorder.none,),
);

重新运行还是显示不全。找到hintMaxLines的定义:

/// The maximum number of lines the [hintText] can occupy.
///
/// Defaults to the value of [TextField.maxLines] attribute.
///
/// This value is passed along to the [Text.maxLines] attribute
/// of the [Text] widget used to display the hint text. [TextOverflow.ellipsis] is
/// used to handle the overflow when it is limited to single line.
final int? hintMaxLines;

从文档注释看,确实不用设置hintMaxLines属性也可以,默认等于TextField组件的maxLines,相关代码位于_TextFieldState类的_getEffectiveDecoration方法。不过,文档中出现了TextOverflow.ellipsis,这难道和这篇文章Flutter问题记录 - Text组件设置不限行数无效的问题一样?可是这里并没有设置overflow的属性为TextOverflow.ellipsis

继续找到使用hintMaxLines属性的位置,位于_InputDecoratorState类的build方法:


Widget build(BuildContext context) {...final String? hintText = decoration.hintText;final Widget? hint = hintText == null? null: AnimatedOpacity(opacity: (isEmpty && !_hasInlineLabel) ? 1.0 : 0.0,duration: _kTransitionDuration,curve: _kTransitionCurve,child: Text(hintText,style: hintStyle,textDirection: decoration.hintTextDirection,overflow: hintStyle.overflow ?? TextOverflow.ellipsis,textAlign: textAlign,maxLines: decoration.hintMaxLines,),);...
}

破案了,当没有设置hintStyle.overflow时,会默认设置为TextOverflow.ellipsis,再加上hintMaxLinesnull,这对于Text组件来说,必会截断为一行,具体缘由请看Flutter问题记录 - Text组件设置不限行数无效。

原因找到了,那问题就好解决啦!加上overflow设置,只要不是TextOverflow.ellipsis都可以:

TextField(maxLines: null,decoration: InputDecoration(hintText: 'Text that suggests what sort of input the field accepts.' * 5,hintStyle: const TextStyle(overflow: TextOverflow.fade),border: InputBorder.none,),
);

重新运行,一切正常🎉!

screenshot2

这个遗留的TODO有点久远了,在我印象中当时好像还有其他问题解决不了。翻了翻Flutter框架的历史提交记录,果然现在的解决方法搁那时候也还是行不通的。那时候overflow是硬编码的,直到去年11月才改成现在这样,详见hintText TextOverflow:

screenshot3

解决方案

TextField组件的提示文本hintText不限制行数时,需要通过hintStyle设置overflow属性,只要不是TextOverflow.ellipsis都可以。

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~


http://www.ppmy.cn/news/109844.html

相关文章

elementUI中<el-select>下拉框选项过多的页面优化方案——多列选择

效果展示(多列可以配置) 一、icon下拉框的多列选择: 二、常规、通用下拉框的多列选择: 【注】第二种常规、通用下拉框的多列选择,是在第一种的前端代码上删除几行代码就行(把icon显示标签删去),所以下面着重…

root 密码破解(rd.break)

在Linux系统中,忘记root密码时,可以用此方法进行暴力修改root密码 示例: 设置一个新的记不住的密码 $ echo cnakdnvf | passwd --stdin root $ poweroff 1.启动此虚拟机,选中以下行,并按 【 e 】进入内核编辑页面 …

数据库服务器

数据库服务器,联系Web服务器与DBMS的中间件是负责处理所有的应用程序服务器,包括在web服务器和后台的应用程序或数据库之间的事务处理和数据访问。 基本信息 中文名 数据库服务器 外文名 database server 功能 数据库服务器建立在数据库系统基础上&a…

pycharm内置Git操作失败的原因

文章目录 问题简介解决方案DNS缓存机制知识的自我理解 问题简介 最近在pycharm中进行代码改动递交的时候,总是出现了连接超时或者推送被rejected的情况,本以为是开了代理导致的,但是关闭后还是推送失败,于是上网查了以后&#xf…

微信小程序授权登录

微信小程序—授权登录 一、小程序登录 登录流程时序 说明: 1.小程序端调用 wx.login() 获取临时登录凭证code ,并回传到开发者服务器。 2.服务器调用 code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 之后开发者服务器可以根…

【C++入门】什么是内联函数?

目录 一、概念 为什么要有内联函数? 内联函数设计的初衷是为了替代部分 #define 宏定义 二、特性 1.空间换时间 2.编译器做主 3.声明定义放一起 总结 一、概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用函数的地方展开,没有…

【22-23 春学期】AI作业12-LSTM

网络 LSTM(输入门、遗忘门、输出门) LSTM(长短时记忆网络)是一种特殊的RNN(循环神经网络),能够学习长期的依赖关系。它通过原始 RNN 的隐藏层只有一个状态,它对于短期的输入非常敏感…

Spring Cloud Alibaba - 服务注册与发现(Nacos)

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:微服务 🥭本文内容&…