2024年4月24日
1. Flutter IgnorePointer & AbsorbPointer
如果您想禁用某个区域的触摸,或者换句话说,您想让触摸指针不起作用怎么办。在 Flutter 中,您可以使用 IgnorePointer 或AbsorbPointer,接下来我就会来介绍两者的区别。
- 使用 IgnorePointer
- IgnorePointer的构造函数如下:
const IgnorePointer({
Key key,
this.ignoring = true,
this.ignoringSemantics, Widget child, }
属性:
bool ignoring
: 命中测试是否忽视小部件Widget child
: The widget to be rendered.
也就是说如果ignoring为true的话,所有发生在widget点击事件都将失效。
// 使用方法
IgnorePointer(ignoring: _ignoring, child: MyWidget(), )
使用AbsorbPointer
// `**构造函数:**`
const AbsorbPointer({
Key key,
this.absorbing = true,
Widget child,
this.ignoringSemantics,
})
IgnorePointer和AbsorbPointer之间的区别
在上面的例子中,行为IgnorePointer
和AbsorbPointer
外观相似。那么,这两个小部件之间有什么区别。下面的例子使差异显而易见。
现在,我们有一个Stack
由两个位置完全相同的按钮组成的。按钮 2 位于按钮 1 上方。按钮 2 被包裹在 内IgnorePointer
。单击按钮时,SnackBar
将显示 a。
-
如果
ignoring
设置为true
并且您单击按钮,您将看到SnackBar
来自按钮 1。这意味着在按钮 2 上忽略指针,但在按钮 1 上检测到指针。 -
如果
absorbing
设置为true
并且您单击按钮,则按钮 1 和按钮 2 都不会触发SnackBar
. 这意味着指针被吸收而不是传递到下面的层AbsorbPointer
。
这就是两者的区别。*ignoring忽略不影响事件响应,absorbing丢弃事件响应链直接终止*
2. Flutter中的混合模式(BlendMode)详解与实践
在Flutter中,BlendMode
是一个枚举类型,它定义了当我们将一个图层叠加到另一个图层上时,两个图层之间的颜色应该如何混合。Flutter提供了多种混合模式,每种模式都有其特定的效果和用途。
混合模式的种类
Clear
Clear
模式将完全透明化上层图层,结果只显示下层的颜色。
Src
Src
模式仅显示上层图层的颜色,完全忽略下层图层。
Dst
Dst
模式与Src
相反,仅显示下层图层的颜色,完全忽略上层图层。
SrcOver
SrcOver
是默认的混合模式。它将上层图层的颜色绘制到下层图层上,但会考虑下层图层的alpha值(透明度)。如果下层完全透明,则结果颜色与上层图层相同;如果下层完全不透明,则结果颜色是上下层颜色的混合。
DstOver
DstOver
模式与SrcOver
相反,它将下层图层的颜色绘制到上层图层上,但会考虑上层图层的alpha值。
SrcIn
SrcIn
模式只在上层图层和下层图层都非透明的地方显示上层图层的颜色。如果任一图层透明,则结果颜色也是透明的。
DstIn
DstIn
模式只在上层图层和下层图层都非透明的地方显示下层图层的颜色。
SrcOut
SrcOut
模式只在上层图层透明而下层图层非透明的地方显示上层图层的颜色。
DstOut
DstOut
模式只在上层图层非透明而下层图层透明的地方显示下层图层的颜色。
SrcATop
SrcATop
模式会在上层图层和下层图层都非透明的地方显示上层图层的颜色,但如果上层图层透明,则显示下层图层的颜色。
DstATop
DstATop
模式与SrcATop
相反,它会在上层图层和下层图层都非透明的地方显示下层图层的颜色,但如果下层图层透明,则显示上层图层的颜色。
Xor
Xor
模式会在上层图层和下层图层颜色不同的地方显示颜色,相同的地方则显示为透明。
Plus
Plus
模式将上层图层和下层图层的颜色相加,不考虑alpha值。结果颜色可能会超过设备的颜色范围,因此可能需要额外的处理。
PlusDarker
PlusDarker
模式与Plus
类似,但结果颜色会向暗色方向调整,以避免颜色溢出。
Multiply
Multiply
模式将上层图层和下层图层的颜色相乘,得到的结果颜色通常比两者都要暗。
Screen
Screen
模式与Multiply
相反,它将上层图层和下层图层的反色相乘,得到的结果颜色通常比两者都要亮。
Overlay
Overlay
模式结合了Multiply
和Screen
的效果,根据上层图层的alpha值来决定使用哪种模式。
Darken
Darken
模式会在上层图层和下层图层中选择较暗的颜色作为结果颜色。
Lighten
Lighten
模式与Darken
相反,它会在上层图层和下层图层中选择较亮的颜色作为结果颜色。
ColorDodge
ColorDodge
模式会提亮下层图层的颜色,以反映上层图层的颜色。
ColorBurn
ColorBurn
模式会加深下层图层的颜色,以反映上层图层的颜色。
HardLight
HardLight
模式会根据上层图层的颜色来提亮或加深下层图层的颜色,取决于上层图层的亮度。
SoftLight
SoftLight
模式与HardLight
类似,但效果更加柔和。
Difference
Difference
模式会从下层图层的颜色中减去上层图层的颜色,或从上层图层的颜色中减去下层图层的颜色,取决于哪个颜色的亮度更高。
Exclusion
Exclusion
模式与Difference
类似,但效果更加柔和,它会在两个颜色之间寻找一个中间值,以避免产生过于鲜艳的颜色。
3. 隐藏视图Widget的三种方式
// 例如:
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 方式一:if判断
if(a=="显示")
Text("显示"),
// 方式二:Offstage组件 true时:隐藏,false时:显示
Offstage(
offstage: false,
child: Text("显示"),
),
// 方式三: Visibility true时:显示,false时:隐藏
Visibility(
visible: true,
child: Text("显示")
)
],
),
Offstage和Visibility的区别:
- 1、Visibility 隐藏/可见,能保存组件的状态;Offstage不能保存组件的状态,组件重新加载。
- 2、当Offstage不可见(true)的时候,如果child有动画等,需要手动停掉,Offstage并不会停掉动画等操作。
- 3、当Offstage初始化不可见(true)时,子组件还是会还是会被构建和运行,只是UI不会显示出来而已,而Visibility初始化不可见(false)时,子组件会运行但是不会被构建(另外为了性能我们有时候可以直接使用if语句控制会更好,if语句为false时,组件既不会构建也不会运行)
- 4、Offstage隐藏时不占空间,Visibility可以设置隐藏时占据空间也可以不占据空间,默认隐藏时不占据空间
备注:Visibility隐藏时占据空间如下:
Visibility(
visible:false,
maintainAnimation: true, ///默认false
maintainSize: true, ///默认false
maintainState: true, ///默认false
child: Text("显示"),
),
强调:maintainSize就是保持大小不变,如果只设置这个属性,会报错,另外两个属性:maintainAnimation和maintainState也必须同时设置。