Flutter 你需要知道的那些事 01

Flutter 你需要知道的那些事 01

公眾號「AndroidTraveler」首發。

1. width 屬性

對於設置控件寬度填充父控件這件事情,在 Android 裡面,只需要設置 MATCH_PARENT 即可。

但是在 Flutter 裡面卻不是這樣,因為 Flutter 要具體的數值。

所以我們可以這樣考慮,假設我這個值非常大,比所有市面上的設備寬度還要大,那麼是不是表現出來就是充滿父控件了。

所以這邊的做法是設置為無限,即 double.infinite

我們以一個常用場景來說明。

比如設置圖片填充屏幕寬度。

剛開始沒有設置的代碼如下:

效果:

Flutter 你需要知道的那些事 01

可以看到沒有設置的情況下,顯示會根據圖片自身的寬高顯示。

這個時候如果設置 width 為無窮大,修改代碼如下:

效果

Flutter 你需要知道的那些事 01

什麼情況,沒起作用?

Flutter 你需要知道的那些事 01

這個時候不要慌,我們來給大家分析分析。

以後大家遇到類似問題也可以這樣分析。

我們通過給 Image 外面套上一層 Container,然後設置背景顏色來對比一下。

代碼如下:

效果如下:

Flutter 你需要知道的那些事 01

可以看到,設置寬度之後,Image 確實是填充了寬度,只不過由於圖片本身沒有那麼寬,因此看起來就以為是沒有起作用。

那麼如何讓圖片可以填充寬度呢?

這個就涉及到圖片的填充模式了。

2. fit 屬性

點擊 Image 的 fit 屬性進入源碼可以看到如下:

我們再點一下 BoxFit,可以看到如下:

相信大家看到源碼的註釋應該很清楚每個值的意義了。

如果你還不清楚,可以點擊註釋裡面對應的鏈接去查看示意圖。

比如以我們這個實際應用場景填充寬度為例,那麼我們可以看到 fitWidth 應該是符合我們要求的,我們點擊註釋的鏈接,跳轉可以看到圖片如下:

Flutter 你需要知道的那些事 01

很形象的做了幾種情況的示意。我們設置了 Image 的 fit 屬性如下:

效果:

Flutter 你需要知道的那些事 01

可以看到已經滿足我們的需求了。

溫馨提示:測試完之後不要忘記去掉測試的 Container 以及對應顏色哦~

3. print

我們知道在 Android 裡面,當我們 try catch 之後,我們打印異常基本會寫出類似下面代碼:

在 Flutter 也有異常捕獲。

你可能會習慣的寫出如下代碼:

但是切記,不要使用上面的寫法。

因為當 e 為 null 時,上面的 print 不會執行打印。

這可能會誤導你。因為你在成功的時候加上打印語句,異常捕獲也加上打印語句。但是程序就是沒有打印。你就會覺得很奇怪。

實際上當 e 為 null 時,print 語句會報錯,+ 號連接的左右不能是 null,所以不會正常打印。因此請避免上面的寫法。可以用下面的替換寫法:

4. GestureDetector

我們知道如果要給一個 Widget 增加點擊事件,最簡單的方法就是套一層 GestureDetector。

但是有時候你這樣做了,卻發現有些“隱患”,或者說,有些你意料不到的事情。

這裡用一個場景來告訴你,你平時可能沒有發現的細節。

微博裡面有點贊這個小組件,我們寫下如下代碼:

效果如下:

Flutter 你需要知道的那些事 01

假設我們要求給這個點贊組件加上點擊事件,那麼我們直接給 Row 套上 GestureDetector Widget。

點擊點贊組件確實會打印 onTap,但是如果你點擊了點贊圖標和數字中間的白色區域,你會發現點擊事件沒有回調,沒有打印。

Flutter 你需要知道的那些事 01

這個時候有兩種解決方法:

1. 給空白組件設置 color 屬性,顏色值設置透明

對於 Container 設置的 padding 可以直接設置,對於我們這裡例子的 SizeBox 需要改為如下:

為了方便測試,這邊將寬度改為 15。

所以對於設置 GestureDetector 的 Container,如果沒有設置 color 屬性,那麼點擊空白不會回調。

2. 設置 GestureDetector 的 behavior 屬性(推薦方式)

其實如果你需要空白區域也響應點擊,只需要設置一下 GestureDetector 的 behavior 屬性即可。

behavior 默認值為 HitTestBehavior.deferToChild,我們這裡將其設置為 HitTestBehavior.translucent

代碼如下:

這裡的點贊圖片我直接從網上獲取的,你測試可以用隨便一張圖片代替驗證。或者用兩個文本來驗證也是可以的。


分享到:


相關文章: