flutter系列之:Material中的3D組件Card
簡介
除了通用的組件之外,flutter還提供了兩種風格的特殊組件,其中在Material風格中,有一個Card組件,可以很方便的繪製出卡片風格的介面,並且還帶有圓角和陰影,非常的好用,我們一起來看看吧。
Card詳解
在詳細講解Card之前,我們考慮一下什麼時候會用到Card?
一提到Card大家第一印象就是名片,在名片中描述了一個人的相關資訊,比如姓名,電話和郵箱等。而Card就是將一組相關的資訊放在一起呈現的組件。
我們來看下Card的定義:
class Card extends StatelessWidget
可以看到Card是一個無狀態的Widget,Card的構造函數需要傳入比較多的參數,下面是Card的構造函數:
const Card({
Key? key,
this.color,
this.shadowColor,
this.elevation,
this.shape,
this.borderOnForeground = true,
this.margin,
this.clipBehavior,
this.child,
this.semanticContainer = true,
})
color表示的是Card的背景顏色,如果不設置的話,會使用ThemeData.cardTheme中指定的color,如果CardTheme.color也是空的話,那麼會使用ThemeData.cardColor來替代。
shadowColor表示的是Card陰影的顏色,如果不設置的話,會使用ThemeData.cardTheme的shadowColor來代替,如果CardTheme.shadowColor也是空的話,那麼會使用ThemeData.shadowColor來替代。
elevation是Card在Z軸的位置,通過設置這個值,我們可以控制Card下面shadow的大小。
shape是Card的形狀,它是一個ShapeBorder對象,有很多已知的實現,比如CircleBorder,RoundedRectangleBorder,ContinuousRectangleBorder,BeveledRectangleBorder等。
borderOnForeground表示是否將Card的border在child之前展示。
clipBehavior是Card的裁剪規則。margin是card周圍的空白部分。
semanticContainer是一個bool值,表示Card中的child是否都具有相同的semantic,或者說他們的類型是一致的。
最後一個參數就是child了,表示Card中的子元素。雖然Card中的child只有一個,但是這個child可以是可以包含多個child的widget,比如Row或者Column等。
Card的使用
通過上面的講解,我們對Card的使用也有了基本的了解,接下來我們可以通過一個具體的例子,來看看Card具體是如何使用的。
雖然Card裡面包含了一個child widget,這個child widget可以是任何值,但是通常來說還是和Column或者Row一起使用的比較多。
這裡我們使用Column來創建一個類似於名片的介面。
Column中有一個children的屬性,可以包含多個子元素,我們可以在每一行中放上圖片或者文字,如果要想進行複雜的布局,還可以自由進行複雜的組合。
但是對於類似名片這種常見的應用,flutter早就為我們想好了,所以他提供了一個叫做ListTile的組件。
ListTile是一個固定高度的Row,並且可以包含一個leading icon或者trailing icon。還可以包含title,subtitle還有一些點擊的交互,非常的方便。
具體ListTile的使用,大家可以去參考具體的API,這裡就不過多講述。
這裡我們只是借用ListTile來構造我們需要的效果。
不同的ListTile組件,可以用Divider來進行分割,讓介面更加美觀。
下面是我們CardApp的程式碼:
class CardApp extends StatelessWidget{
const CardApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return SizedBox(
height: 210,
child: Card(
child: Column(
children: [
const ListTile(
title: Text(
'Han MeiMei',
style: TextStyle(fontWeight: FontWeight.w500),
),
subtitle: Text('上海,張江'),
leading: SizedBox(
width: 20,
child:Center(
child: CircleAvatar(
backgroundImage: AssetImage('images/head.jpg'),
radius: 10,
))
),
),
const Divider(),
ListTile(
title: const Text(
'18888888888',
style: TextStyle(fontWeight: FontWeight.w500),
),
leading: Icon(
Icons.contact_phone,
color: Colors.blue[500],
),
),
ListTile(
title: const Text('[email protected]'),
leading: Icon(
Icons.contact_mail,
color: Colors.blue[500],
),
),
],
),
),
);
}
}
將CardApp放在Scaffold的body中運行,可以得到下面的介面:
大家可以看到Card的底部是有明顯的3D效果的。這裡我們使用了三個ListTile,其中第一個同時包含了title和subTtile這兩個屬性。
前面兩個ListTile使用Divider進行分割,非常的好用。
總結
以上就是flutter中Card的使用了,大家可以結合ListTile一起構建更加美觀和複雜的系統。
更多內容請參考 www.flydean.com
最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!