代码编织梦想

Flutter 开发问题点一览



1. 问题描述

Flutter iOS风格文本输入控件 CupertinoTextField 在Android系统中文本输入框光标未与输入提示文本对齐,现象如下图

在这里插入图片描述

2. 原因、对策

观察 CupertinoTextField 在 Android系统中的表现可以发现,光标高度与文本高度是一样高的,但光标位置向上偏移了一些。
对比 Android 与 iOS的效果可以发现,Android的光标高度短于 iOS的光标高度。

在这里插入图片描述
原因

CupertinoTextField 的光标在Andorid与iOS中的绘制起点一致,但因长度在Android偏短,造成了光标未与提示文本对齐的现象。

对策

  • 方式一:设置 CupertinoTextField 的属性 cusorHeight 为具体的值()
      CupertinoTextField(
        cursorHeight: 26.0,
      )
  • 方式二:修改 CupertinoTextField 中文本 TextStyle 的高度属性height
      CupertinoTextField(
        style: TextStyle(height: 1.2),
      ),
  • 方式三:使用 Android 风格的文本输入框TextField

3. 源码分析

3.1 查看 CupertinoTextField 源码

查看光标的高度的属性 cursorHeight ,其值实际是赋予给了 EditableText.cursorHeight

3.2 查看 EditableText.cursorHeight属性

在这里插入图片描述
如果未设置 cursorHeight 则使用 RenderEditable.preferredLineHeight

在这里插入图片描述
preferredLineHeight 的值为 TextPainter.preferredLineHeight

在这里插入图片描述
preferredLineHeight 的值与 TextStyle 相关,默认高度为文本 空格 的高度

在这里插入图片描述
最终通过Native方法返回高度
依次调用顺序为
CupertinoTextField -> EditableText -> _Editable -> RenderEditable -> preferredLineHeight -> TextPainter.preferredLineHeight

3.3 查看 cursorHeight 的具体使用

第1、2步知道了光标默认的高度与 TextStyle 相关,并未了解到为何iOS与Android的光标高度不一致。
继续查看 RenderEditable 源码,可以发现在 _computeCaretPrototype 方法中进行了游标绘制的相关计算,并说明了此问题。

在这里插入图片描述
3.4 结论

该现象为Flutter的特意而为之,现阶段需要开发人员自己适配,将来或许会改善。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/ww897532167/article/details/111109626

IOS UIWindow 和 UIScreen-爱代码爱编程

通常UIWindow 与 UIScreen 是配合使用的。当我们想自定义window对象或者获取硬件屏幕大小必定会用到 UIWindow 和 UIScreen UIWindow 一个APP只有一个UIWindow 对象,表示当前窗口对象。UIWindow 继承于 UIView。 通常使用Window 自定义根节点的 UIViewControl

ios 升级后,滚轮选择的时间控件失效 UIDatePicker-爱代码爱编程

变成这个样子了     2.如果使用以前的样式 datepicker.preferredDatePickerStyle = .wheels 不知道是不是苹果的bug 宽高都不对 let datepicker = UIDatePicker(frame: CGRect(x: 0, y: 100, width: self.view.frame

Flutter iOS风格中Widget内容滑到了顶部导航栏后面与其重叠-爱代码爱编程

Flutter 开发问题点一览 Flutter iOS风格中Widget内容滑到了顶部导航栏后面与其重叠Flutter iOS风格文本输入框CupertinoTextField光标在Android中未与提示文本对齐 文章目录 Flutter 开发问题点一览1. 问题描述2. 原因、对策3. 源码分析 1. 问题描述 Flutter在iOS风格

记录安装flutter的一些坑-爱代码爱编程

记录Flutter 安装出现的一些问题 1 首先下载Flutter sdk 建议安装最新版 下载地址https://www.baidu.com/link?url=L5t4aE9yfDnUkfVgc7CXvvZ4HmjYod_GnvSqMqOv646EZBhIJMospzbR2ezCbBYz1V9D8svA5quwyYnfAga5UK&wd=&am

Flutter自定义布局排列:多个子View-爱代码爱编程

简单例子:该例子让多个子View垂直排列 class LinearLayout extends MultiChildRenderObjectWidget { LinearLayout({ Key key, List<Widget> child }): super(key: key , children: child)

Flutter自定义布局排列:单个子View-爱代码爱编程

简单例子:该例子实现了子View居中对齐效果 class CenterLayout extends SingleChildRenderObjectWidget { CenterLayout({ Key key, Widget child }): super(key: key , child: child); @overri