iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 6
0
Mobile Development

30天手滑用Google Flutter解鎖Hybrid App成就系列 第 6

30天Flutter手滑系列 - 文字(Text Widgets)、圖片相關組件(Assets, Images, Icon Widgets)與文字輸入(Input Widgets)

  • 分享至 

  • xImage
  •  

在上一篇30天Flutter手滑系列 - 基本組件(Basic Widgets),介紹了基本會用的Widgets外,接下來這篇也是一定會用到的文字與圖片Widgets,以下就分別對它們個別介紹。

文字組件(Text Widgets)

1. DefaultTextStyle

最基本的文字組件,沒有明確定義任何樣式,就想像它是純文字好了,如果需要單行樣式,需要考慮用Text


2. Text

單一樣式的文字。如先前提到,文字的斷點位置依據容器而定。
Style這個屬性是非必需的,若沒給定的情況下,會繼承最近的外層樣式,跟CSS的樣式效果一樣。TextStyle.inherit可以決定是否有這個繼承效果。

下方範例針對超過長度限制的文字,改以...(ellipsis)顯示,並且字體的樣式設為粗體。
https://ithelp.ithome.com.tw/upload/images/20190913/20120028gLlz047IIQ.png

Text(
  'Hello, $_name! How are you?',
  textAlign: TextAlign.center,
  overflow: TextOverflow.ellipsis,
  style: TextStyle(fontWeight: FontWeight.bold),
)

3. RichText

RichText用來針對同一個段落文字內可以有不同樣式的widget。
這個widget必須明確指定一個預設樣式,可以設為DefaultTextStyle,然後針對個別文字再去給定不同的樣式。

下面範例是一段RichText,先指定整段文字為DefaultTextStyle,然後個別文字再去用TextSpan給定不同樣式。
https://ithelp.ithome.com.tw/upload/images/20190913/201200280xR5RtrgZj.png

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)),
    ],
  ),
)

圖片相關組件(Assets, images, and icon widgets)

1. AssetBundle

這是在整個App內會被使用到的資源檔案(resources)的集合,像是圖片或是文字檔。
要存取這些檔案可以透過NetworkAssetBundle 用非同步的方式載入
,或是直接存取本機端資源。
在應用程式內有個rootBundle,若被加入到rootBundle內,即放到assets這個資料夾內的檔案,會隨著整個應用程式一起被打包。
加入後記得修改pubspec.yaml檔案,例如下方範例。

name: my_awesome_application
flutter:
  assets:
   - images/hamilton.jpeg
   - images/lafayette.jpeg

相較於rootBundle,可以在個別層級使用AssetBundle,放入一些非必要隨著整個應用程式被打包的資源,這些資源只會在執行時被載入。


2. Icon

在Flutter內,Icon也是一種widget,這邊內建的圖示是基於material設計。
本身不具有互動性,如果需要互動性的效果可以參考IconButton
在這個widget會假定引入的圖示是正方形的,非正方型圖示會可能會有錯誤產生。

下方範例示範不同的圖示,具有不同尺寸及顏色。
https://ithelp.ithome.com.tw/upload/images/20190913/20120028DDQRwVsjpk.png

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,
    ),
  ],
)

3. Image

用來顯示圖片的Widget,支援格式有:JPEG、PNG、GIF、Animated GIF、WebP、Animated WebP、BMP和WBMP。

引入圖片的方法有很多種:

以下範例用的是NetworkImage,這是其中一種ImageProvider
https://ithelp.ithome.com.tw/upload/images/20190913/20120028mAsi3ZlKvR.jpg

const Image(
  image: NetworkImage('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg'),
)

或是可以用本身widget帶有的方法Image.network

https://ithelp.ithome.com.tw/upload/images/20190913/20120028HOIL0i9bdo.jpg

Image.network('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg')

4. RawImage

這個widget用來直接顯示dart:ui.Image,然後官方都說這很冷門了,建議直接使用Image就好,我也暫時想不到可以應用的場景。


文字輸入組件(Input Widgets)


總結

Text跟Image算是一定會用到的widgets,也被官方歸類為basic widgets,因此有些段落跟前一章節有重疊。
不過今天中秋節嘛,輕鬆讀完這篇也好。
結束今天靜態的widget後,明天開始會介紹佈局(layout)的部分,這樣才知道有什麼排列組合的方法,把各個widgets放入。

祝大家中秋節快樂 Happy Mid-autumn Festival!

https://ithelp.ithome.com.tw/upload/images/20190913/20120028pZ2c70Wjjp.jpg


參考資料

https://flutter.dev/docs/development/ui/widgets/assets
https://flutter.dev/docs/development/ui/widgets/text


上一篇
30天Flutter手滑系列 - 基本組件(Basic Widgets)
下一篇
30天Flutter手滑系列 - 布局組件(Layout Widgets)(上)
系列文
30天手滑用Google Flutter解鎖Hybrid App成就30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
阿展展展
iT邦好手 1 級 ‧ 2020-01-22 10:57:57

吃太胖 /images/emoticon/emoticon36.gif

我要留言

立即登入留言