Flutter 小技巧之 InkWell Ink 你了解多少

news2024/11/28 5:50:24

今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 Material ,可以轻松实现带有水波纹等的点击效果。

而之所以要介绍这个,主要是发现好像有一部分人对于 InkWell 的点击效果实现存在误解,例如,你知道水波纹是如何实现的吗?

首先,如下代码所示,可以看到代码运行后在屏幕中间出现了一个蓝色的正方形,此时如果你点击正方形,会发现 click InkWell 会正常打印,但是却看不到水波效果,这是为什么呢?

其实这里和 InkWell 的 child 有关系,如果把上面蓝色的 Containercolor 修改为 Colors.blue.withAlpha(100) ,如下图所示,可以看到此时水波纹效果又出现了。

所以一开始水波纹效果之所以会看不到,直接原因其实是因为被 InkWell 的 child 的蓝色给覆盖

所以可以明确一点, InkWell 的水波纹和点击效果,其实是在底部产生。

事实上 , InkWell 的点击效果并不是通过它自身产生的,而是通过 Material 实现的动画绘制,默认情况下使用的是 Scaffold 内部的 Material 来完成点击效果的绘制。

所以对于不熟悉 InkWell 的开发者来说,这是一个比较反直觉的设定 InkWell 的点击效果不是通过自身产生的,而是默认通过所在的 Scaffold 内的 Material 来完成点击动画。

所以,当你不使用 Scaffold 直接引用 InkWell 时,就会收到如下图所示的错误提示,因为没有了 Scaffold , 默认的 Material 不存在了,一般这时候我们可以手动添加多一个 Material 控件来解决错误。

Material 是如何实现点击动画

事实上在 Material 内部存在一个叫 _InkFeatures 的控件,就是它负责在点击产生时绘制点击效果,如下图所示,InkWell 默认会有 InkSplashInkHighlight 两个点击效果,它们分别对应水波纹效果和高亮效果

InkWell 的点击时如何通知 Material 绘制动画?

首先,如下图所示,当 InkWell 内有点击产生时会触发 _startNewSplash 方法,然后通过控件位置和大小去创建当前所需的 InkFeature

正如前面所示,默认情况下 InkWell 在点击时会创建一个 InkSplashInkHighlight ,它们分别对应水波纹效果和点击高亮效果,而不管是 InkSplash 还是 InkHighlight ,它们在被创建的时候,都会通过 Material.of(context) 获取 MaterialInkController ,然后再创建通过 controller 的 addInkFeature() 方法将点击效果添加到 Material 中。

Material 中,addInkFeature 会通过 markNeedsPaint 来使得 _InkFeatures 发生重绘,从而触发 InkSplashInkHighlight 的点击 paint 动画。

当然,有添加就有移除,例如 InkHighlight 就会在动画结束时调用 dispose 方法移除对应的 InkFeature

image-20230619151104834

那么简单总结一下: InkWell 的点击效果是通过 Material 实现,默认使用的是 Scaffold 自带的 Material

那么既然 InkWell 的点击效果是通过 Material 实现,前面点击的水波纹和高亮效果其实是被 Container 的背景色遮挡,如下图所示,这时候我们可以添加多一个 Material ,然后将背景色挪到 Material 上,此时可以看到点击效果恢复正常。

当然,你也可以将颜色挪到更外层的 Container ,这样就不会遮挡到 Material 绘制点击动画的效果。

那么还有没有更优雅的做法?这就不得不提 Ink

Ink 的作用就是为了方便使用 InkWell 的点击效果而存在, 你可以把 Container 上的 colordecoration 等配置挪到 Ink 上从而解决 Material 的点击效果被遮挡的问题。

因为 Ink 内部是通过 InkDecoration 实现主要逻辑,而 InkDecoration 本身也是一个 InkFeature , 所以在触发点击效果时, InkDecoration 作为 InkFeature ,在创建时同样会调用 controller.addInkFeature(this); ,所以同样会触发绘制,只是绘制的层级在 InkWell 内其他 InkFeature 之下。

当然,如下图所示你也可以这么写, Ink 的核心理念就是实现在 Material 空间上进行绘制,这样就不会干扰或者遮挡后续 InkWell 的点击效果

所以 Ink 相当于时另辟蹊径,利用 Material 的特性来解决覆盖问题,所以针对 InkWell 点击效果被覆盖问题,你是选择调整层级配合 Material 还是使用 Ink

当然,如果你想要的去除水波纹点击效果,那么可以参考 《Flutter 3 下的 ThemeExtensions 和 Material3》 。

那么本篇小技巧到这里就结束啦,是不是很简单,核心主要是理解 InkWell 点击效果的由来,避免有时候自己被某些坑绕进去而无法自拔,如果你还有什么想说的,欢迎留言评论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode 安装配置教程详解包含c++环境配置方法

vscode安装教程及c环境配置详解 vscode下载安装下载C扩展插件VScode C环境配置配置环境变量检查 MinGW 安装配置编译器:配置构建任务检查是否安装了编译器配置完毕 vscode下载安装 地址:官网下载地址 直接打开下载好的.exe文件进行安装即可&#xff0…

如何使用 PowerPoint 2021 制作演示文稿?

软件安装:办公神器office2021安装教程,让你快速上手_正经人_____的博客-CSDN博客 引言 PowerPoint 是一款非常常用的演示文稿制作工具,它可以帮助您创建漂亮的幻灯片,展示您的想法和信息。如果您是 PowerPoint 的新手&#xff…

xx客滑块

xx客滑块 网址流程1、访问首页,得到网页源代码得到 sessionId2、生成dInfo参数(getInfoTp接口使用到),是AES 加密(不校验)3、访问 /captcha/getInfoTp 得到responseId (可以认为是图片id&#x…

上海细化“元宇宙”概念 落地场景仍待破局

日前,一份关于“元宇宙”更加具体的行动方案引发业内高度关注:上海发布《上海市“元宇宙”关键技术攻关行动方案(2023—2025年)》的通知。 这说明政府层面开始进一步细化,以更好推动‘元宇宙’产业的发展。” 主攻沉…

【强烈推荐】基于STM32的TFT-LCD各种显示实现(内容详尽含代码)

前言:TFT-LCD模块作为人们日常生活中常见屏幕类型之一,使用的受众面非常广阔。例如:显示各个传感器数值,显示精美界面,多级化菜单系统等等都不离不开他的身影。可以说学会TFT-LCD模块是嵌入式开发必须掌握的驱动开发技…

AOP切面记录日志

AOP切面记录日志 一、导包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>二、写一个注解 /*** 用于切面记录日志用的注解&#xff0c;只能加在方法中使用* a…

让性能腾飞!亚马逊云科技的 Java 云端之旅

在上篇文章中&#xff0c;我们为大家介绍了亚马逊的 Java 生态及丰富的开发工具、框架。本文将分享亚马逊的 Java 架构、迁移途径&#xff0c;并分享一个具体实例&#xff0c;介绍如何使用机器学习来构建 Java 应用和提升 Java 性能。 亚马逊云科技开发者社区为开发者们提供全…

vulhub-structs2-S2-009 远程代码执行漏洞复现

漏洞描述 影响版本: 2.1.0 - 2.3.1.1 漏洞原理 Struts2对s2-003的修复方法是禁止#号&#xff0c;于是s2-005通过使用编码\u0023或\43来绕过&#xff1b;于是Struts2对s2-005的修复方法是禁止\等特殊符号&#xff0c;使用户不能提交反斜线。 但是&#xff0c;如果当前action…

Java---第三章(选择,循环,二重循环语句,输入,调试,标签)

Java---第三章 一 流程图二 选择结构简单的if-else嵌套的if-else多重if的选择语句&#xff08;else-if&#xff09;switch语句 二 输入验证三 程序调试四 循环结构while循环do-while循环for循环流程控制二重循环&#xff08;重点&#xff09; 五 标签 label&#xff08;标号&am…

代码随想录二刷day27 | 回溯之 39. 组合总和 40.组合总和II 131.分割回文串

day27 39. 组合总和回溯三部曲剪枝优化 40.组合总和II回溯三部曲 131.分割回文串回溯三部曲判断回文子串 39. 组合总和 题目链接 解题思路&#xff1a; 本题没有数量要求&#xff0c;可以无限重复&#xff0c;但是有总和的限制&#xff0c;所以间接的也是有个数的限制。 本题搜…

AI对话分析,如何赋能销售人员实现销售增长和提升客户满意度?

在当今的商业世界中&#xff0c;销售人员的工作关键在于建立与潜在客户的关系&#xff0c;了解他们的需求&#xff0c;并提供满足这些需求的产品或服务。虽然这听起来简单&#xff0c;但实际上&#xff0c;这需要许多复杂的技能和经验。幸运的是&#xff0c;有许多工具和技术可…

消息队列及常见消息队列介绍

一、消息队列(MQ)概述 消息队列&#xff08;Message Queue&#xff09;&#xff0c;是分布式系统中重要的组件&#xff0c;其通用的使用场景可以简单地描述为&#xff1a; 当不需要立即获得结果&#xff0c;但是并发量又需要进行控制的时候&#xff0c;差不多就是需要使用消息队…

金属元素螯合剂:1189194-64-6,DOTA-(COOt-Bu)3-CH2-Alkynyl,试剂的结构式和CAS分享

文章关键词&#xff1a;双功能螯合剂&#xff0c;大环配体一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; 西安凯新生物科技有限公司供应的​DOTA-(COOt-Bu)3-CH2-Alkynyl中&#xff0c;​DOTA分子是一种十二元四氮杂大环配…

【每日算法】【205. 同构字符串】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

随机2D形状周围层流预测!基于飞桨实现图形神经网络

项目背景 近年来&#xff0c;快速流场预测领域一直由基于像素的卷积神经网络&#xff08;Convolution Neural Network&#xff0c;CNN&#xff09;主导。当 CFD 与基于 CNN 的神经网络模型耦合时&#xff0c;来自网格的数据必须在笛卡尔网格上进行插值&#xff0c;然后再投影回…

Jetpack Compose Material3 组件之 DatePicker(日期选择)

前言 在之前我使用 Comose 写 APP 的时候&#xff0c;官方还没有给出关于 DatePicker 的解决方案。 当时为了在 Compose 中实现 DatePicker &#xff0c;大致有两种方案&#xff1a; 一是使用原生 VIew 的 DatePicker&#xff0c;但是因为觉得我即然都用 Compose 了&#xf…

图书推荐|Python数据分析与挖掘实战(第2版)

Python数据分析与挖掘实战&#xff08;第2版&#xff09;一共分为三个部分&#xff0c;包括基础篇&#xff08;第1&#xff5e;5章&#xff09;、实战篇&#xff08;第6&#xff5e;12章&#xff09;、提高篇&#xff08;第13章&#xff09;。其中基础篇介绍了数据挖掘的基本原…

揭秘猫狗的微生物世界:肠道微生物群的意义和影响

谷禾健康 “铲屎官”们都希望自己的宠物有一个健康的身体。但是猫狗都不会说话&#xff0c;平时我们只能从它们的精神状态来判断它们是否健康&#xff0c;但这并不准确。去宠物医院又不太方便&#xff0c;很多猫咪和狗狗还会对抽血等检查有所抗拒。 肠道微生物检测在人类中的应…

边云协同:大小模型如何协同推理?

1 背景 “化繁为简、大巧不工”是机器学习的初衷之一。 费米曾讲述一个故事&#xff0c;冯诺依曼告诉他&#xff0c;用四个参数就可以拟合出一头大象&#xff0c;用五个参数就可以让大象鼻子动起来&#xff0c;这就是“四个参数画大象”的故事。 但AI模型规模不断剧增已是不…

CVE-2023-27524 Apache Superset 身份认证绕过漏洞

漏洞简介 Apache Superset是一个开源的数据可视化和数据探测平台&#xff0c;它基于Python构建&#xff0c;使用了一些类似于Django和Flask的Python web框架。提供了一个用户友好的界面&#xff0c;可以轻松地创建和共享仪表板、查询和可视化数据&#xff0c;也可以集成到其他应…