公眾號「AndroidTraveler」首發。
1. width 屬性
對於設置控件寬度填充父控件這件事情,在 Android 裡面,只需要設置 MATCH_PARENT 即可。
但是在 Flutter 裡面卻不是這樣,因為 Flutter 要具體的數值。
所以我們可以這樣考慮,假設我這個值非常大,比所有市面上的設備寬度還要大,那麼是不是表現出來就是充滿父控件了。
所以這邊的做法是設置為無限,即 double.infinite
我們以一個常用場景來說明。
比如設置圖片填充屏幕寬度。
剛開始沒有設置的代碼如下:
效果:
可以看到沒有設置的情況下,顯示會根據圖片自身的寬高顯示。
這個時候如果設置 width 為無窮大,修改代碼如下:
效果
什麼情況,沒起作用?
這個時候不要慌,我們來給大家分析分析。
以後大家遇到類似問題也可以這樣分析。
我們通過給 Image 外面套上一層 Container,然後設置背景顏色來對比一下。
代碼如下:
效果如下:
可以看到,設置寬度之後,Image 確實是填充了寬度,只不過由於圖片本身沒有那麼寬,因此看起來就以為是沒有起作用。
那麼如何讓圖片可以填充寬度呢?
這個就涉及到圖片的填充模式了。
2. fit 屬性
點擊 Image 的 fit 屬性進入源碼可以看到如下:
我們再點一下 BoxFit,可以看到如下:
相信大家看到源碼的註釋應該很清楚每個值的意義了。
如果你還不清楚,可以點擊註釋裡面對應的鏈接去查看示意圖。
比如以我們這個實際應用場景填充寬度為例,那麼我們可以看到 fitWidth 應該是符合我們要求的,我們點擊註釋的鏈接,跳轉可以看到圖片如下:
很形象的做了幾種情況的示意。我們設置了 Image 的 fit 屬性如下:
效果:
可以看到已經滿足我們的需求了。
溫馨提示:測試完之後不要忘記去掉測試的 Container 以及對應顏色哦~
3. print
我們知道在 Android 裡面,當我們 try catch 之後,我們打印異常基本會寫出類似下面代碼:
在 Flutter 也有異常捕獲。
你可能會習慣的寫出如下代碼:
但是切記,不要使用上面的寫法。
因為當 e 為 null 時,上面的 print 不會執行打印。
這可能會誤導你。因為你在成功的時候加上打印語句,異常捕獲也加上打印語句。但是程序就是沒有打印。你就會覺得很奇怪。
實際上當 e 為 null 時,print 語句會報錯,+ 號連接的左右不能是 null,所以不會正常打印。因此請避免上面的寫法。可以用下面的替換寫法:
4. GestureDetector
我們知道如果要給一個 Widget 增加點擊事件,最簡單的方法就是套一層 GestureDetector。
但是有時候你這樣做了,卻發現有些“隱患”,或者說,有些你意料不到的事情。
這裡用一個場景來告訴你,你平時可能沒有發現的細節。
微博裡面有點贊這個小組件,我們寫下如下代碼:
效果如下:
假設我們要求給這個點贊組件加上點擊事件,那麼我們直接給 Row 套上 GestureDetector Widget。
點擊點贊組件確實會打印 onTap,但是如果你點擊了點贊圖標和數字中間的白色區域,你會發現點擊事件沒有回調,沒有打印。
這個時候有兩種解決方法:
1. 給空白組件設置 color 屬性,顏色值設置透明
對於 Container 設置的 padding 可以直接設置,對於我們這裡例子的 SizeBox 需要改為如下:
為了方便測試,這邊將寬度改為 15。
所以對於設置 GestureDetector 的 Container,如果沒有設置 color 屬性,那麼點擊空白不會回調。
2. 設置 GestureDetector 的 behavior 屬性(推薦方式)
其實如果你需要空白區域也響應點擊,只需要設置一下 GestureDetector 的 behavior 屬性即可。
behavior 默認值為 HitTestBehavior.deferToChild,我們這裡將其設置為 HitTestBehavior.translucent。
代碼如下:
這裡的點贊圖片我直接從網上獲取的,你測試可以用隨便一張圖片代替驗證。或者用兩個文本來驗證也是可以的。
閱讀更多 安卓小煜 的文章