Flutter元件學習(一)—— Text元件

24K純帥豆發表於2018-11-26

序言

之前說會給大家一一講解 Flutter 中的元件,今天我們們就從 Text 元件開始,無圖言X,先上圖:

image

Text元件的API

我們先來看一下 Text 元件的構造方法

class Text extends StatelessWidget {
  const Text(this.data, {
    Key key,
    this.style,
    this.textAlign,
    this.textDirection,
    this.locale,
    this.softWrap,
    this.overflow,
    this.textScaleFactor,
    this.maxLines,
    this.semanticsLabel,
  }) : assert(data != null),
       textSpan = null,
       super(key: key);
       
  const Text.rich(this.textSpan, {
    Key key,
    this.style,
    this.textAlign,
    this.textDirection,
    this.locale,
    this.softWrap,
    this.overflow,
    this.textScaleFactor,
    this.maxLines,
    this.semanticsLabel,
  }): assert(textSpan != null),
      data = null,
      super(key: key);
}
複製程式碼

構造方法有兩個,一個是預設的 Text 樣式,一個是現實豐富 Text.rich 樣式,這樣解釋大家應該能猜得到就和 Android 中的 SpannableString 一樣,下面來看一下 Text 元件的一些 API

API名稱 功能
textAlign 文字對齊方式(center居中,left左對齊,right右對齊,justfy兩端對齊)
textDirection 文字方向(ltr從左至右,rtl從右至左)
softWare 是否自動換行(true自動換行,false單行顯示,超出螢幕部分預設截斷處理)
overflow 文字超出螢幕之後的處理方式(clip裁剪,fade漸隱,ellipsis省略號)
textScaleFactor 字型顯示倍率
maxLines 文字顯示最大行數
style 字型的樣式設定

下面是 TextStyleAPI

API名稱 功能
decoration 文字裝飾線(none沒有線,lineThrough刪除線,overline上劃線,underline下劃線)
decorationColor 文字裝飾線顏色
decorationStyle 文字裝飾線風格([dashed,dotted]虛線,double兩根線,solid一根實線,wavy波浪線)
wordSpacing 單詞間隙(如果是負值,會讓單詞變得更緊湊)
letterSpacing 字母間隙(如果是負值,會讓字母變得更緊湊)
fontStyle 文字樣式(italic斜體,normal正常體)
fontSize 文字大小
color 文字顏色
fontWeight 字型粗細(bold粗體,normal正常體)

還有一點需要注意的是,在 Flutter 中,並不是每個 Widget 都有點選事件,比如 Text 就沒有,這時候你需要用一個 GestureDetector 元件包住 Text 元件,然後實現它裡面的 onTap() 事件,詳細看下面程式碼:

class _TextViewWidget extends State<TextViewWidget> {
  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        Text('什麼也不設定'),
        Padding(
          padding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 0.0),
          child: Text(
            '設定換行設定換行設定換行設定換行設定換行設定換行設定換行設定換行設定換行設定換行設定換行',
            //是否自動換行 false文字不考慮容器大小,單行顯示,超出螢幕部分將預設截斷處理
            softWrap: true,
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 0.0),
          child: Text(
            '設定超出螢幕之後的顯示規則設定超出螢幕之後的顯示規則設定超出螢幕之後的顯示規則設定超出螢幕之後的顯示規則',
            //文字超出螢幕之後的處理方式  TextOverflow.clip剪裁   TextOverflow.fade 漸隱  TextOverflow.ellipsis省略號
            overflow: TextOverflow.ellipsis,
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 0.0),
          child: Text(
            '設定最大顯示行數設定最大顯示行數設定最大顯示行數設定最大顯示行數設定最大顯示行數設定最大顯示行數設定最大顯示行數',
            maxLines: 2,
            overflow: TextOverflow.ellipsis,
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 0.0),
          child: Text(
            '文字方向 sasasasasasasasasasasasasasasasasasasasasasa bdbdbdbdbdbdbdbdbdbdbdb',
            //TextDirection.ltr從左至右,TextDirection.rtl從右至左
            textDirection: TextDirection.rtl,
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 0.0),
          child: Text(
            '文字對齊方式 sasasasasasasasasasasasasasasasasasasasasasa bdbdbdbdbdbdbdbdbdbdbdb',
            //TextAlign.left左對齊,TextAlign.right右對齊,TextAlign.center居中對齊,TextAlign.justfy兩端對齊
            textAlign: TextAlign.center,
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 0.0),
          child: Text(
            '設定顏色和大小',
            style: TextStyle(
              color: const Color(0xfff2c2b2),
              fontSize: 17,
            ),
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 0.0),
          child: Text(
            '設定粗細和斜體',
            style: TextStyle(
              //字型粗細,粗體和正常
              fontWeight: FontWeight.bold,
              //文字樣式,斜體和正常
              fontStyle: FontStyle.italic,
            ),
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 0.0),
          child: Text(
            '設定文字裝飾',
            style: TextStyle(
              //none無文字裝飾,lineThrough刪除線,overline文字上面顯示線,underline文字下面顯示線
              decoration: TextDecoration.underline,
              decorationColor: Colors.red,
              decorationStyle: TextDecorationStyle.wavy
            ),
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 0.0),
          child: Text(
            '單詞間隙 hello world i am jack',
            style: TextStyle(
              wordSpacing: 10.0,
            ),
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 0.0),
          child: Text(
            '字母間隙 hello world',
            style: TextStyle(
              letterSpacing: 10.0,
            ),
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 0.0),
          child: GestureDetector(
            onTap: () {
              print("點選了按鈕");
            },
            child: Text(
              '設定文字點選事件',
              style: TextStyle(
                color: Colors.blue,
                fontWeight: FontWeight.bold,
                fontStyle: FontStyle.italic,
              ),
            ),
          ),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 0.0),
          child: Text.rich(
            new TextSpan(
                text: 'Text.rich',
                style: new TextStyle(
                    color: Colors.yellow,
                    fontSize: 13,
                    decoration: TextDecoration.none),
                children: <TextSpan>[
                  new TextSpan(
                      text: '拼接1',
                      style: new TextStyle(
                          color: Colors.blue,
                          fontSize: 14,
                          decoration: TextDecoration.none)),
                  new TextSpan(
                      text: '拼接2',
                      style: new TextStyle(
                          color: Colors.black,
                          fontSize: 15,
                          decoration: TextDecoration.none)),
                  new TextSpan(
                      text: '拼接3',
                      style: new TextStyle(
                          color: Colors.red,
                          fontSize: 16,
                          decoration: TextDecoration.none)),
                  new TextSpan(
                      text: '拼接4',
                      style: new TextStyle(
                          color: Colors.grey,
                          fontSize: 17,
                          decoration: TextDecoration.none)),
                ]),
          ),
        )
      ],
    );
  }
}
複製程式碼

程式碼已上傳至Github

公眾號

歡迎關注我的個人公眾號【IT先森養成記】,專注大前端技術分享,包含Android,Java,Kotlin,Flutter,HTML,CSS,JS等技術;在這裡你能得到的不止是技術上的提升,還有一些學習經驗以及志同道合的朋友,趕快加入我們,一起學習,一起進化吧!!!

公眾號:IT先森養成記

相關文章