在上一篇30天Flutter手滑系列 - 基本組件(Basic Widgets),介紹了基本會用的Widgets外,接下來這篇也是一定會用到的文字與圖片Widgets,以下就分別對它們個別介紹。
最基本的文字組件,沒有明確定義任何樣式,就想像它是純文字好了,如果需要單行樣式,需要考慮用Text。
單一樣式的文字。如先前提到,文字的斷點位置依據容器而定。
Style這個屬性是非必需的,若沒給定的情況下,會繼承最近的外層樣式,跟CSS的樣式效果一樣。TextStyle.inherit可以決定是否有這個繼承效果。
下方範例針對超過長度限制的文字,改以...
(ellipsis)顯示,並且字體的樣式設為粗體。
Text(
'Hello, $_name! How are you?',
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontWeight: FontWeight.bold),
)
RichText用來針對同一個段落文字內可以有不同樣式的widget。
這個widget必須明確指定一個預設樣式,可以設為DefaultTextStyle,然後針對個別文字再去給定不同的樣式。
下面範例是一段RichText,先指定整段文字為DefaultTextStyle,然後個別文字再去用TextSpan給定不同樣式。
RichText(
text: TextSpan(
text: 'Hello ',
style: DefaultTextStyle.of(context).style,
children: <TextSpan>[
TextSpan(text: 'beautiful', style: TextStyle(fontStyle: FontStyle.italic)),
TextSpan(text: ' world', style: TextStyle(fontWeight: FontWeight.bold)),
],
),
)
這是在整個App內會被使用到的資源檔案(resources)的集合,像是圖片或是文字檔。
要存取這些檔案可以透過NetworkAssetBundle 用非同步的方式載入
,或是直接存取本機端資源。
在應用程式內有個rootBundle,若被加入到rootBundle內,即放到assets
這個資料夾內的檔案,會隨著整個應用程式一起被打包。
加入後記得修改pubspec.yaml檔案,例如下方範例。
name: my_awesome_application
flutter:
assets:
- images/hamilton.jpeg
- images/lafayette.jpeg
相較於rootBundle,可以在個別層級使用AssetBundle,放入一些非必要隨著整個應用程式被打包的資源,這些資源只會在執行時被載入。
在Flutter內,Icon也是一種widget,這邊內建的圖示是基於material設計。
本身不具有互動性,如果需要互動性的效果可以參考IconButton。
在這個widget會假定引入的圖示是正方形的,非正方型圖示會可能會有錯誤產生。
下方範例示範不同的圖示,具有不同尺寸及顏色。
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: const <Widget>[
Icon(
Icons.favorite,
color: Colors.pink,
size: 24.0,
semanticLabel: 'Text to announce in accessibility modes',
),
Icon(
Icons.audiotrack,
color: Colors.green,
size: 30.0,
),
Icon(
Icons.beach_access,
color: Colors.blue,
size: 36.0,
),
],
)
用來顯示圖片的Widget,支援格式有:JPEG、PNG、GIF、Animated GIF、WebP、Animated WebP、BMP和WBMP。
引入圖片的方法有很多種:
以下範例用的是NetworkImage,這是其中一種ImageProvider:
const Image(
image: NetworkImage('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg'),
)
或是可以用本身widget帶有的方法Image.network。
Image.network('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg')
這個widget用來直接顯示dart:ui.Image,然後官方都說這很冷門了,建議直接使用Image就好,我也暫時想不到可以應用的場景。
Text跟Image算是一定會用到的widgets,也被官方歸類為basic widgets,因此有些段落跟前一章節有重疊。
不過今天中秋節
嘛,輕鬆讀完這篇也好。
結束今天靜態的widget後,明天開始會介紹佈局(layout)的部分,這樣才知道有什麼排列組合的方法,把各個widgets放入。
https://flutter.dev/docs/development/ui/widgets/assets
https://flutter.dev/docs/development/ui/widgets/text