Flutter 对齐与相对定位

对齐与相对定位(Align)

定义

1
2
3
4
5
6
Align({
this.alignment = Alignment.center,
this.widthFactor,
this.heightFactor,
Widget child,
})
  • alignment : 需要一个AlignmentGeometry类型的值,表示子组件在父组件中的起始位置。AlignmentGeometry 是一个抽象类,它有两个常用的子类:Alignment和 FractionalOffset,我们将在下面的示例中详细介绍。
  • widthFactor和heightFactor是用于确定Align 组件本身宽高的属性;
    • 它们是两个缩放因子,会分别乘以子元素的宽、高,最终的结果就是Align 组件的宽高。
    • 如果值为null,则组件的宽高将会占用尽可能多的空间。

Flutter 层叠布局

层叠布局

层叠布局和 Web 中的绝对定位布局是相似的,子组件可以根据距父容器四个角的位置来确定自身的位置。层叠布局允许子组件按照代码中声明的顺序堆叠起来。
Flutter中使用Stack和Positioned这两个组件来配合实现绝对定位。
Stack允许子组件堆叠,而Positioned用于根据Stack的四个角来确定子组件的位置。

Flutter SwiftUI
Row HStack
Column VStack
Stack ZStack

iOS Lock

锁 🔒

锁用于解决多线程间资源共享的安全问题

分类:

  • 自旋锁(Spinlock): 即忙等,类似 do-while,会一直占着CPU、内存等即忙碌状态
  • 互斥锁(Mutex): 闲等,即锁的线程处于休眠状态
    • 非递归锁(non-recursive mutex)或称不可重入互斥锁(non-reentrant mutex): 同一时刻只能被一条线程所拥有
    • 可递归锁(recursive mutex)或称可重入互斥锁(reentrant mutex): 同一时刻能被多条线程所拥有
  • 读写锁: 多读单写、读和写要互斥,有空再补

Flutter 流式布局

流式布局

Wrap

对于Wrap和Flex(包括Row和Column)除了超出显示范围后Wrap会折行外,其它行为基本相同

  • spacing:主轴方向子widget的间距
  • runSpacing:纵轴方向的间距
  • runAlignment:纵轴方向的对齐方式

Flow

Flow主要用于一些需要自定义布局策略或性能要求较高(如动画中)的场景

Flutter 弹性布局

弹性布局 (Flex)

弹性布局允许子组件按照一定比例来分配父容器空间, 主要通过Flex和Expanded来配合实现。

Flex

定义, 相比Row、Column多了两个参数, 其实他们都是继承于Flex;

1
2
3
4
5
6
7
const Flex({
// ...
required this.direction, // 布局的方向: 水平、垂直方向
// ...
this.clipBehavior = Clip.none,
// ...
})

LLDB

LLDB

  • po: 为 print object 的缩写,显示对象的文本描述, expression -O的别称
  • bt: 打印当前堆栈信息
  • register read xx: 读取寄存器
  • memory read/个数+格式+每个地址单元的长度 内存地址 查看内存数据
    • 默认为:memory read/16xb
    • 格式: x-16进制、f-浮点数,d-10进制,u-10进制无符号,o-8进制,t-2进制
      a-16进制格式+实际地址类型,i-指令地址格式,c-按字符格式
    • 字节数: b-1个字节,h-2个字节,w-4个字节,g-8个字节。
    • x = memory read x/16xb
  • memory write 地址 数据 向指定内存写入数据

Flutter 布局约束

布局约束

Flutter 中有两种布局模型:

  • 基于 RenderBox 的盒模型布局。
  • 基于 Sliver ( RenderSliver ) 按需加载列表布局。

大致布局流程如下:

  1. 上层组件向下层组件传递约束(constraints)条件。
  2. 下层组件确定自己的大小,然后告诉上层组件。注意下层组件的大小必须符合父组件的约束。
  3. 上层组件确定下层组件相对于自身的偏移和确定自身的大小(大多数情况下会根据子组件的大小来确定自身的大小)。

因为任何时候子组件都必须先遵守父组件的约束

编译Objc4-838

编译Objc源码

要诀:
能删则删, 不确定先注释,
需加须加, 能设置就设置.

准备工作

本次编译objc4-838源码, 即对应macOS 12.2, 高版本未尝试, 理论上大版本一致可行
以下相关源码均可在Apple Open SourcemacOS Monterey 12 -> macOS 12.2 分支看到