当前位置: 首页 > news >正文

Flutter InkWell组件去掉灰色遮罩

当InkerWell组件内部获取到焦点时,会展示一层灰色遮罩
在这里插入图片描述
将focusColor属性设置为透明即可

Flutter InkWell焦点效果源码分析

问题描述

当 InkWell 组件获得焦点时,会显示一层灰色遮罩效果。需要找出这个效果是由哪些组件控制的,以及具体的实现机制。

排查思路

1. 从InkWell组件入手

首先查看 InkWell 类的定义:

class InkWell extends InkResponse {const InkWell({Key? key,Widget? child,Color? focusColor,// ...更多属性})

发现:

  • InkWell 继承自 InkResponse
  • 有 focusColor 属性可以控制焦点颜色

2. 追踪InkResponse实现

在 InkResponse 中找到焦点相关的重要方法:

void handleFocusUpdate(bool hasFocus) {_hasFocus = hasFocus;statesController.update(MaterialState.focused, hasFocus);updateFocusHighlights();widget.onFocusChange?.call(hasFocus);
}

关键发现:

  • 焦点状态变化时会调用 updateFocusHighlights()
  • 使用 statesController 管理状态

3. 分析高亮实现

找到 updateHighlight 方法:

void updateHighlight(_HighlightType type, { required bool value }) {final InkHighlight? highlight = _highlights[type];if (value) {if (highlight == null) {_highlights[type] = InkHighlight(controller: Material.of(context)!,referenceBox: referenceBox,color: getHighlightColorForType(type),shape: widget.highlightShape,// ...);}}
}

重要发现:

  • 使用 InkHighlight 类来实现高亮效果
  • 高亮效果存储在 _highlights Map 中
  • 通过 Material.of(context) 获取控制器

4. 追踪颜色获取逻辑

在 getHighlightColorForType 方法中:

Color getHighlightColorForType(_HighlightType type) {final ThemeData theme = Theme.of(context);switch (type) {case _HighlightType.focus:return widget.focusColor ?? theme.focusColor;// ...}
}

了解到:

  • 焦点颜色优先使用 widget.focusColor
  • 如果未指定则使用主题中的 focusColor

5. 分析Material实现

Material 组件的作用:

  • 创建 _RenderInkFeatures 来管理 ink 效果
  • 提供 MaterialInkController 接口
  • 处理实际的绘制逻辑
class _RenderInkFeatures extends RenderProxyBox implements MaterialInkController {void addInkFeature(InkFeature feature) {_inkFeatures ??= <InkFeature>[];_inkFeatures!.add(feature);markNeedsPaint();}void paint(PaintingContext context, Offset offset) {if (_inkFeatures != null && _inkFeatures!.isNotEmpty) {final Canvas canvas = context.canvas;// 绘制所有ink特效for (final InkFeature inkFeature in _inkFeatures!) {inkFeature._paint(canvas);}}}
}

实现流程总结

  1. 触发焦点:

    • Focus widget 检测到焦点变化
    • 调用 handleFocusUpdate
  2. 创建高亮:

    • updateFocusHighlights 判断是否需要显示焦点
    • updateHighlight 创建 InkHighlight 实例
  3. 设置颜色:

    • getHighlightColorForType 获取焦点颜色
    • 优先使用 focusColor 属性,否则使用主题颜色
  4. 渲染过程:

    • InkHighlight 被添加到 Material 的 _inkFeatures
    • _RenderInkFeatures 在绘制时遍历所有特效
    • 通过 Canvas API 实现最终的视觉效果

修改建议

如果需要自定义焦点效果,可以:

  1. 设置 InkWell 的 focusColor 属性
  2. 在 ThemeData 中配置全局 focusColor
  3. 使用 MaterialState 配置更复杂的状态样式

相关类和文件

  • InkWell
  • InkResponse
  • InkHighlight
  • Material
  • MaterialInkController
  • _RenderInkFeatures

参考

  • Flutter SDK Material 源码
  • Flutter 文档中的 InkWell 部分

相关文章:

Flutter InkWell组件去掉灰色遮罩

当InkerWell组件内部获取到焦点时&#xff0c;会展示一层灰色遮罩 将focusColor属性设置为透明即可 Flutter InkWell焦点效果源码分析 问题描述 当 InkWell 组件获得焦点时&#xff0c;会显示一层灰色遮罩效果。需要找出这个效果是由哪些组件控制的&#xff0c;以及具体的…...

Android——metaData

获取元数据信息的步骤&#xff1a; 调用 getPackageManager 方法获得当前应用的包管理器调用包管理器的 getActivityInfo 方法获得当前活动的信息对象活动信息对象的 metaData 是 Bundle 包裹类型&#xff0c;调用包裹对象的 getString 即可获得指定名称的参数值 配置 metaDa…...

SLAM|1. 相机投影及相机畸变

一个能思考的人&#xff0c;才真是一个力量无边的人。——巴尔扎克 本章主要内容&#xff1a; 1.针孔相机模型 2.相机成像的几个坐标系图像 3.畸变及相机标定 本节主要介绍在照相机拍摄过程中&#xff0c;现实物体如何跟照片上的像素关联起来&#xff0c;具体涉及相机成像的物…...

nginx配置及虚拟主机

nginx配置及虚拟主机 一、http协议介绍1、网站类型2、涉及的软件3、http协议介绍 二、nginx安装、启动1、nginx介绍2、nginx安装3、nginx启动管理 三、nginx配置文件1、配置文件语法结构2、全局配置3、事件驱动模型的配置4、http的配置 四、虚拟主机配置1、类型2、基于名称的虚…...

ElasticSearch - Bucket Script 使用指南

文章目录 官方文档Bucket Script 官文1. 什么是 ElasticSearch 中的 Bucket Script&#xff1f;2. 适用场景3. Bucket Script 的基本结构4. 关键参数详解5. 示例官方示例&#xff1a;计算每月 T 恤销售额占总销售额的比率百分比示例计算&#xff1a;点击率 (CTR) 6. 注意事项与…...

Android的SQLiteOpenHelper类 笔记241027

SQLiteOpenHelper SQLiteOpenHelper是Android开发中用于管理SQLite数据库的一个非常重要的工具类。以下是对SQLiteOpenHelper的详细介绍&#xff1a; 一、基本概念 SQLiteOpenHelper是一个抽象类&#xff0c;它主要用于管理数据库的创建和版本管理。通过继承这个类&#xff…...

「Mac畅玩鸿蒙与硬件10」鸿蒙开发环境配置篇10 - 项目实战:计数器应用

本篇将通过一个简单的计数器应用,带你体验鸿蒙开发环境的实际操作流程。本项目主要练习组件的使用、事件响应和状态管理,帮助开发者熟悉基本的应用构建流程。 关键词 计数器应用组件操作事件响应状态管理HarmonyOS 应用开发一、创建计数器项目 1.1 在 DevEco Studio 中新建项…...

安卓逆向之ARM汇编寻址,汇编指令

一&#xff1a;ARM汇编寻址 1. 立即数寻址 (Immediate Addressing) 指令中直接给出一个常数值&#xff08;立即数&#xff09;&#xff0c;并对其进行操作。 MOV R0, #5 ; 将立即数5载入寄存器R02. 直接寻址 (Direct Addressing) 指令中给出的地址直接指定了内存中的一…...

Idea常见插件(超级实用)

文章目录 Idea好用的插件推荐Idea插件安装Chinese(中文版)Alibaba Java Coding Guidelines&#xff08;代码规范&#xff09;Auto Filling Java Arguments&#xff08;自动补全参数&#xff09;CamelCase&#xff08;变量名称格式转换&#xff09;CodeGeeX&#xff08;智能&…...

C++中如何获取时间并格式化为字符串?

在C中&#xff0c;你可以使用标准库中的 <chrono> 和 <iomanip> 头文件来获取当前时间并将其格式化为字符串。以下是一个简单的示例&#xff0c;展示了如何获取当前时间并将其格式化为一个可读的字符串&#xff08;例如&#xff1a;YYYY-MM-DD HH:MM:SS&#xff09…...

项目1 yolov5鱼苗检测计数

yolov5鱼苗检测 1. yolov5鱼苗检测1.1. 环境配置1.2 Predict1.3 Validate1.4 Train1.5 生成 ONNX 2 代码解析2.1 模型2.2 数据集2.3 损失函数2.4 训练2.5 预测 之前做的项目&#xff0c;再回顾一下 环境&#xff1a;GPU1卡&#xff0c;CPU4核&#xff0c;每显卡12GB&#xff0c…...

GPU 学习笔记三:GPU多机多卡组网和拓扑结构分析(基于数据中心分析)

文章目录 一、概述二、数据中心&#xff08;DC&#xff09;2.1 数据中心简介2.2 传统数据中心的网络模型2.3 脊叶网络模型&#xff08;Spine-Leaf&#xff09;2.4 Facebook的Fabric网络架构 三、基于数据中心的多机多卡拓扑3.1 Spine-Leaf 架构网络规模测算方法3.2 NVIDIA多机多…...

各编程语言处理HTTP状态码的库推荐

Http 状态码用那个库 备注 Spring 的状态码库为 org.springframework.http.HttpStatus Apache 的状态码库为&#xff1a; org.apache.http.HttpStatus 通常这 2 个库都差不多。 如你的项目中已经用了 Spring 的代码的话&#xff0c;那么就用 Spring 的库吧。 不管是那个库…...

【Mac】Python 环境管理工具

一、pyenv 1、安装 &#xff08;1&#xff09;安装 brew install pyenv&#xff08;2&#xff09;环境配置 查看系统使用 shell 是 bash 还是 zsh bash 配置文件&#xff1a;~/.bash_profile zsh 配置文件&#xff1a;~/.zshrc userMac ~ % echo $SHELL /bin/zsh userMa…...

大语言模型数据流程源码解读(基于llama3模型)

文章目录 前言一、数据进入LlamaForCausalLM(LlamaPreTrainedModel)类二、数据进入LlamaModel(LlamaPreTrainedModel)类1、input_ids的embedding编码2、position_ids位置获取3、causal_mask因果mask构建1、causal_mask调用2、因果mask代码解读(_update_causal_mask)4、hidden_s…...

[蓝桥杯 2015 省 A] 饮料换购

题目描述 乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料&#xff0c;凭 3 个瓶盖可以再换一瓶 C 型饮料&#xff0c;并且可以一直循环下去(但不允许暂借或赊账)。 请你计算一下&#xff0c;如果小明不浪费瓶盖&#xff0c;尽量地参加活动&#xff0c;那么&#xff…...

K8S测试pod内存和CPU资源不足

只设置requests参数 mysql主从pod启动后监控 读压测之后 同时设置limits和requests&#xff0c;只调低内存值 监控 压力测试 同时设置limits和requests&#xff0c;只调低CPU值 初始状态 开始压测 结论 对于CPU&#xff0c;如果pod中服务使用CPU超过设置的limits&…...

rabbitmq 使用注意事项

1&#xff0c;注意开启的端口号&#xff0c;一共四个端口号&#xff0c;1883是mqtt连接的端口号&#xff0c;如果没开&#xff0c;是连接不上的需要手动起mqtt插件。 //开始mqtt插件服务 rabbitmq-plugins enable rabbitmq_mqtt 2&#xff0c;15672端口是http网页登录的管理后…...

<项目代码>YOLOv8 夜间车辆识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…...

xterm.js 库作用

前言&#xff1a;xterm.js 是一个用于在网页上模拟终端的强大 JavaScript 库。 一、在网页中实现终端模拟 1. 提供类似终端的界面 xterm.js可以在浏览器中创建一个看起来和行为都类似于传统终端的界面。这包括显示命令行提示符、接受用户输入、显示命令输出等。 例如&#…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...