網(wǎng)站首頁 編程語言 正文
Flutter中的按鈕
自Flutter 1.20 新增了ButtonStyleButton 系列按鈕,可以說非常好用了,默認樣式比之前漂亮了許多,擴展性也增加了很多。按鈕樣式統(tǒng)一由ButtonStyle這個類提供,支持根據(jù)各種狀態(tài)(MaterialState)變化的屬性,也增強了桌面平臺也友好性。
值 | 狀態(tài) |
---|---|
hovered | 鼠標滑入 |
focused | 焦點 |
pressed | 按下 |
dragged | 拖動 |
selected | 選中 |
scrolledUnder | 與滾動內(nèi)容疊加 |
disabled | 不可用 |
error | 錯誤 |
最常用到的就是pressed和disabled還有桌面端的hovered。
可變化的屬性
屬性 | 說明 | 備注 |
---|---|---|
backgroundColor | 背景色 | Flutter3.3版本之前對應 primary或onPrimary |
foregroundColor | 前景色(文本顏色) | Flutter3.3版本之前對應 primary或onPrimary |
elevation | 模擬物理深度 | 其實就是陰影淺重 |
fixedSize | 按鈕尺寸 | 受最大尺寸和最小尺寸和布局影響 |
maxinumSize | 最大尺寸 | ? |
minimumSize | 最小尺寸 | ? |
mouseCursor | 鼠標圖標 | ? |
overlayColor | 高亮色 | ? |
padding | 內(nèi)容邊距 | ? |
shadowColor | 陰影顏色 | ? |
shape | 按鈕形狀 | 由OutlinedBorder定義 |
side | 邊框樣式 | ? |
surfaceTintColor | Material3使用的材質(zhì)顏色 | ? |
textStyle | 文本樣式 | ? |
可以看到默認按鈕樣式,主要針對的是形狀,顏色和交互效果(overlay splash),普通情況下也夠用的。
不完美的地方
但是,要想進一步定制按鈕效果,比如設計師提供的按鈕,是漸變色的,那怎么辦呢? 比較常見的做法是用Container自己寫一個按鈕出來。Container的decoration可以說非常好用了,支持單色,漸變,以及裝飾圖。AnimatedContainer還能對各種屬性做動畫展現(xiàn)。
但是 按鈕要做的事情,不止是一個背景這么簡單。比如上面提到的狀態(tài),以及點擊反饋,語義化等等。要使用Container把這一整套實現(xiàn)出來,會非常繁瑣。
在child中處理
Button的child可以是任何Widget,那么,把Container放到child里來實現(xiàn)定制背景怎樣呢?且不說Button默認的padding之類的,Button的效果,都是在背景層實現(xiàn)的,child中的任何可見元素,都會覆蓋在這層背景之上。簡單來說,就是覆蓋背景的同時會覆蓋掉Button的Splash等overlay效果。
外面套一個wrapper
把Button套進Container里,在Container的decoration中做背景。這個方法首先要做的就是把Button的背景和陰影去除,那么除了在Container里做背景,還要模擬出Button的陰影。
AnimatedContainer(
duration: Duration(milliseconds:200),
width: width,
height: height,
transformAlignment: Alignment.center,
clipBehavior: clipBehavior,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue,Colors.red]
),
shadow: [BoxShadow(
...
)]
),
child: ElevatedButton(
//...
),
);
初步來看,這個方法還是可行的。重點就在于怎么把需要增強的屬性組織起來,并且和按鈕的狀態(tài)結合起來了。
MaterialStateProperty
按鈕的動態(tài)屬性,都是基于這個狀態(tài)屬性處理的,它可以根據(jù)當前的屬性集合,匹配到合適的屬性提供回來。
MaterialStatesController
按鈕狀態(tài)的控制器,可以通過這個控制器來監(jiān)聽按鈕的狀態(tài),做出對應處理
邊距問題
ButtonStyle中有一個tapTargetSize屬性(非動態(tài)屬性),定義了點擊目標的擴展邊距,在移動設備上默認情況下按鈕會向上/下多出一點邊距,導致Container的背景比按鈕尺寸多出一塊,按鈕的overlay效果鋪不滿,手動指定TapTargetSize.shrinkWrap就可以了。
EnhancedButton
結合以上想法,整理了style及wrapper實現(xiàn)了一個增加的按鈕,效果如下
本來命名的ExtendedButton,結果被一個不維護的包占用了名字,就改成了EnhancedButton。雖然目前還有些許不完美的方面,以后再慢慢優(yōu)化吧。
github: github.com/shirne/exte…
pub: pub.flutter-io.cn/packages/en…
原文鏈接:https://juejin.cn/post/7142073198115291144
相關推薦
- 2022-09-25 如何對已有docker容器增加新的端口映射詳解_docker
- 2022-10-01 詳解React?Fiber架構原理_React
- 2022-12-10 React實現(xiàn)控制減少useContext導致非必要的渲染詳解_React
- 2022-03-22 .NET?6中間件Http?Logging使用介紹_實用技巧
- 2022-11-03 C/C++預處理淺析使用形式_C 語言
- 2023-02-01 Python動態(tài)演示旋轉矩陣的作用詳解_python
- 2022-05-24 Django框架cookie和session方法及參數(shù)設置_python
- 2022-05-08 Entity?Framework根據(jù)實體的EntityState狀態(tài)實現(xiàn)增刪改查_實用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支