flutter筆記(二)-----hello world和文本組件Text、TextSpan

flutter筆記匯總

代碼的世界從hello world開始,flutter也一樣。
創建一個項目,將lib文件夾下的main.dart改為如下代碼:

 3 void main() => runApp(MyApp());
  4
  5 class MyApp extends StatelessWidget {
  6   @override
  7   Widget build(BuildContext context) {
  8     return MaterialApp(
  9       title: 'Flutter Demo',
 10       home: Scaffold(
 11         body: new Center(
 12           child: new Text(
 13             'hello world'
 14           )
 15         )
 16       )
 17     );
 18   }
 19 }

跑起來

image.png

hello world完成了。

先簡單介紹兩個組件

1、Scaffold

打開任意一款app,頂部標題欄、側邊抽屜、底部導航等...,基本上都有這里邊的一個或者幾個,基于這個現狀,material很貼心的提供了scaffold這個組件,相當于一個頁面的骨架,可以把上邊說的那些東西拼到里邊。

2、Center

很簡單的一句話,這個組件的子組件水平垂直居中。
這兩個只是簡單的介紹一下,以后再詳細說,接下來是這篇筆記的主角。

文本Widget

一、Text

hello world這個demo里用過了,相當于html里邊的<p></p>,但是又有所不同,都知道p標簽獨占一行,寬度如果沒有限制則為父級寬度,Text也是獨占一行,但是寬度為內容寬度,并且沒有width屬性。
看上邊的demo,是不是感覺字體有點小,還想換個顏色,加個下劃線...還有其他各種騷操作。
先看一下官網給出的Text

const Text(
  String data,                                   //文本上邊demo的hello world
  {
    Key key,                                   //唯一標識,相當于react中map渲染節點的key
    TextStyle style,                            //樣式
    StrutStyle strutStyle,                    //???不知道干啥的
    TextAlign textAlign,                      //對齊方式
    TextDirection textDirection,          //文本的書寫順序
    Locale locale,                                //設置語言環境  就是國際化,多語言支持
    bool softWrap,                              //文本過長是否自動換行
    TextOverflow overflow,                  //對溢出文本的顯示方式
    double textScaleFactor,                //每個邏輯像素的字體像素數
    int maxLines,                                //文本的最大行數
    String semanticsLabel,                  //圖像的語義描述,用于向Andoid上的TalkBack和iOS上的VoiceOver提供圖像描述
  }
)

接下來挨個看

1、TextStyle

設置字體的樣式

const TextStyle({
  bool inherit: true,                                  //是否繼承父級
  Color color,                                           //字體顏色
  Color backgroundColor,                        //背景色
  double fontSize,                                      //字體大小
  FontWeight fontWeight,                          //字體粗細
  FontStyle fontStyle,                                //正常/斜體
  double letterSpacing,                              //字符間距可為負
  double wordSpacing,                              //字間距(英文單詞間距)
  TextBaseline textBaseline,                        //文本對齊基線
  Height height,                                          //Text的高度,相當于行高
  Local locale,                                            //設置語言環境  就是國際化,多語言支持
  Paint foreground,                                      //不知道是啥
  Paint background,                                      //文本背景色作用和backgroundColor相同
  List<Shadow> shadows,                            //文字陰影
  TextDecoration decoration,                        //劃線
  Color decorationColor,                                //劃線顏色
  TextDecoration decorationStyle,                 //劃線種類
  double decorationThickness,                    //劃線的粗細
  String debugLabel,                                   //文本樣式的文本描述,僅在debug模式下有效           
  String fontFamily,
  List<String> fontFamilyFallback,
  String package,
})

接下來詳解

color

flutter的color支持5種寫法

style: TextStyle(
  color: Color(0xFF42A5F5),                                            //十六進制色號兩個F的位置為透明度,取值范圍00~FF
  color: Color.fromARGB(0xFF, 0x42, 0xA5, 0xF5),         //十六進制色號第一位為透明度,從00~FF
  color: Color.fromARGB(255, 66, 165, 245),                   //十進制色號第一位為透明度,0~255
  color: Color.fromRGBO(66, 165, 245, 1.0),                    //最后一位為透明度, 0.0~1.0
  color: Colors.red                                                   //material內置
)

backgroundColor

背景色和color的寫法一樣

fontSize

字體大小,double類型

style: TextStyle(
  fontSize: 30.0
)

不用寫單位,flutter的單位是dp。

letterSpacing

字符間距

style: TextStyle(
  letterSpacing: 6.0
)

wordSpacing

style: TextStyle(
  wordSpacing: 10.0
)

textBaseline

對齊基線,類似css的基線,alphabetic/ideographic兩個值

style: TextStyle(
  textBaseline: TextBaseline.alphabetic
)

alphabetic:簡單理解為英文的對齊基線
ideographic:簡單理解為中文對齊基線

height

style: TextStyle(
  height: 1.5
)

和css一樣1.5就是字體大小的1.5倍。

background

這個注意了,不是Color,是Paint

style: TextStyle(
  background: Paint() ..color = Colors.blue
)

這個和backgroundColor一樣,兩者不能共存。
..是dart語法糖,前一個函數的返回值的屬性,說的有點繞,看代碼。

Paint() ..color = Colors.blue;
//下邊代碼的簡寫
Paint pg = Paint();
pg.color = Colors.blue;

shadows

List類型

style = TextStyle(
  shadows: [Shadow(color: Colors.black,offset: Offset(5, 6),blurRadius: 3 )]
)

這里說明一下參數
color:陰影顏色,
offset:兩個參數xy方向的偏移量,
blurRadius: 模糊程度

decoration

和css的text-decoration類似

style = TextStyle(
  decoration: TextDecoration.underline
)

有5個值
underline:下劃線
none:無劃線
overline:上劃線
lineThrough:中劃線
combine:這個就厲害了,可以傳入一個List,三線齊劃

decorationColor

劃線的顏色,默認和字體顏色相同。

style: TextStyle(
  decorationColor:  Colors.black
)

decorationStyle

默認為實線

style = TextStyle(
  decorationStyle: TextDecorationStyle.dashed
)

dashed:點劃線
dotted:虛線
double:雙劃線
solid:實線
wavy:波浪線

decorationThickness

劃線的粗細,默認為1

style = TextStyle(
  decorationThickness: 3.0
)

debugLabel

style = TextStyle(
  debugLabel: 'test
)

加上之后沒找到怎么看這個提示。。。

2、strutStyle

看文檔這個應該是style的簡寫,類似css里邊的background/font這種,可以把樣式寫到一起,樣式是有順序的,這里不研究了,不推薦這種寫法,可讀性不高不好維護。

3、textAlign

對齊方式,和css的text-align基本上相同

textAlign: TextAlign.start

start:起始位置
end:結束位置
center:居中
left:左對齊
right:右對齊
justify:兩端對齊

4、textDirection

textDirection: TextDirection.ltr

ltr:從左到右
rtl:從右到左
left to right,right to left

5、locale

locale: Locale('fr', 'CH')

這個不是添加了就會自動翻譯,還要配置其他東西,以及第三方包,以后再詳細說。

6、softWrap

softWrap: true

文本超出容器時是否自動換行,默認為true,為false時文本超出容器部分默認被剪切。

7、overflow

overflow: TextOverflow.clip

對文本溢出部分的處理,類似css中的overflow。
clip:切斷,超出部分不顯示,默認值
ellipsis:超出部分不顯示,顯示...
visible:超出部分強制顯示
fade:超出部分淡出

8、textScaleFactor

textScaleFactor: 1.5

縮放的倍數

9、maxLines

maxLines: 2

文本的最大行數

10、semanticsLabel

semanticsLabel: 'test'

這個應該是相當于html中imgalt
下面上完整代碼,把上邊demo中的Center換成Container(相當于html中的div,下篇筆記詳細說),再加個width便于觀察樣式和屬性對文本的改變。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        body: new Container(
          width: 400.0,
          child: new Text(
            'hello world hello world hello world hello world hello world hello world',
            style: TextStyle(
              color: Color.fromARGB(0xFF, 0x42, 0xA5, 0xF5),
              backgroundColor: Colors.red,
              fontSize: 30.0,
              letterSpacing: 6.0,
              wordSpacing: 15.0,
              height: 2.0,
//              background: Paint() ..color = Colors.blue,
              shadows: [Shadow(color: Colors.black,offset: Offset(5, 6),blurRadius: 3 )],
              decoration: TextDecoration.combine([
                TextDecoration.underline,
                TextDecoration.overline
              ]),
              decorationColor: Colors.black,
              decorationStyle: TextDecorationStyle.wavy,
              decorationThickness: 3.0,
              debugLabel: 'text'
            ),
            textAlign: TextAlign.justify,
            textDirection: TextDirection.rtl,
            locale: Locale('fr', 'CH'),
            softWrap: true,
            overflow: TextOverflow.visible,
            textScaleFactor: 1.5,
            maxLines: 2,
            semanticsLabel: 'test'
          )
        )
      )
    );
  }
}

學習的時候建議不要像這里一樣加太多的樣式和屬性,不相關的屬性或者樣式先單獨練習再組合,有的需要配合使用,比如溢出softWrapoverflowmaxLines這些。

二、TextSpan

html里有個span這里有個TextSpan,作用基本相同,文字放一行,下面看代碼。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        body: new Center(
          child: new Text.rich(
            TextSpan(
              children: [
                new TextSpan(text: 'hello: '),
                new TextSpan(
                  text: 'world',
                  style: TextStyle(
                    color: Colors.red
                  )
                )
              ]
            )
          )
        )
      )
    );
  }
}

效果

image.png

TextSpan需要套一層Text.rich,可以有children,children同為TextSpan,可以分別加不同的樣式,這里只能加樣式,不可以加其他的屬性。
文本組件到這里就結束了,如有遺漏歡迎補充,如有錯誤請指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372