Flutter RichText支持特殊文字效果

extended text 相關(guān)文章

今天繼續(xù)講講怎么樣快速構(gòu)建特殊文字以及自定義背景谆甜,我喜歡那個圖,再次送上

image

大家刷微博應(yīng)該都經(jīng)匙还祝看到罕袋,文字里面有一些比如@某某某,或者一些話題的鏈接朵夏。但是服務(wù)器端一般都是給你一段文字,你需要自己去做匹配捏肢。以前可能每加個邏輯饥侵,你就要寫一段代碼,但是有了Extended text奉瘤,一切都變得so easy煮甥。

舉個栗子成肘,比如我們要匹配@某某某斧蜕,我們只需要繼承SpecialText,并且定義它的開始標志和結(jié)束標志

class AtText extends SpecialText {
  static const String flag = "@";
  AtText(TextStyle textStyle, SpecialTextGestureTapCallback onTap)
      : super(flag, " ", textStyle, onTap: onTap);

  @override
  TextSpan finishText() {
    // TODO: implement finishText

    final String atText = toString();
    return TextSpan(
        text: atText,
        style: textStyle?.copyWith(color: Colors.blue, fontSize: 16.0),
        recognizer: TapGestureRecognizer()
          ..onTap = () {
            if (onTap != null) onTap(atText);
          });
  }
}

然后洒闸,我們需要定義匹配規(guī)則,繼承SpecialTextSpanBuilder均芽,實現(xiàn)方法

class MySpecialTextSpanBuilder extends SpecialTextSpanBuilder {
  @override
  TextSpan build(String data,
      {TextStyle textStyle, SpecialTextGestureTapCallback onTap}) {
    if (data == null || data == "") return null;
    List<TextSpan> inlineList = new List<TextSpan>();
    if (data != null && data.length > 0) {
      SpecialText specialText;
      String textStack = "";
      //String text
      for (int i = 0; i < data.length; i++) {
        String char = data[i];
        if (specialText != null) {
          if (!specialText.isEnd(char)) {
            specialText.appendContent(char);
          } else {
            inlineList.add(specialText.finishText());
            specialText = null;
          }
        } else {
          textStack += char;
          specialText =
              createSpecialText(textStack, textStyle: textStyle, onTap: onTap);
          if (specialText != null) {
            if (textStack.length - specialText.startFlag.length >= 0) {
              textStack = textStack.substring(
                  0, textStack.length - specialText.startFlag.length);
              if (textStack.length > 0) {
                inlineList.add(TextSpan(text: textStack, style: textStyle));
              }
            }
            textStack = "";
          }
        }
      }

      if (specialText != null) {
        inlineList.add(TextSpan(
            text: specialText.startFlag + specialText.getContent(),
            style: textStyle));
      } else if (textStack.length > 0) {
        inlineList.add(TextSpan(text: textStack, style: textStyle));
      }
    }

    // TODO: implement build
    return TextSpan(children: inlineList, style: textStyle);
  }

  @override
  SpecialText createSpecialText(String flag,
      {TextStyle textStyle, SpecialTextGestureTapCallback onTap}) {
    if (flag == null || flag == "") return null;
    // TODO: implement createSpecialText

    if (isStart(flag, AtText.flag)) {
      return AtText(textStyle, onTap);
    } else if (isStart(flag, EmojiText.flag)) {
      return EmojiText(textStyle);
    } else if (isStart(flag, DollarText.flag)) {
      return DollarText(textStyle, onTap);
    }
    return null;
  }
}

最后使用的時候是這樣子的

ExtendedText(
          "[love]Extended text help you to build rich text quickly. any special text you will have with extended text. "
              "\n\nIt's my pleasure to invite you to join \$FlutterCandies\$ if you want to improve flutter .[love]"
              "\n\nif you meet any problem, please let me konw @zmtzawqlp .[sun_glasses]",
          onSpecialTextTap: (String data) {
            if (data.startsWith("\$")) {
              launch("https://github.com/fluttercandies");
            } else if (data.startsWith("@")) {
              launch("mailto:zmtzawqlp@live.com");
            }
          },
          specialTextSpanBuilder: MySpecialTextSpanBuilder(),
          overflow: TextOverflow.ellipsis,
          //style: TextStyle(background: Paint()..color = Colors.red),
          maxLines: 10,
        ),

是不是覺得特別簡單,而且可擴展性強劲妙,媽媽再也不會擔心我沒法做特殊文字的匹配了镣奋。。
上個效果圖哈

image

最后放上 Github Extended_Text余赢,如果你有什么不明白的地方,請告訴我没佑,歡迎加入Flutter Candies蛤奢,一起生產(chǎn)可愛的Flutter 小糖果(QQ群:181398081)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市待秃,隨后出現(xiàn)的幾起案子痹屹,更是在濱河造成了極大的恐慌,老刑警劉巖暖庄,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楼肪,死亡現(xiàn)場離奇詭異春叫,居然都是意外死亡,警方通過查閱死者的電腦和手機暂殖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門呛每,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毙石,你說我怎么就攤上這事颓遏。” “怎么了滤灯?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窒百。 經(jīng)常有香客問我豫尽,道長,這世上最難降的妖魔是什么渤滞? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任妄呕,我火速辦了婚禮嗽测,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疏魏。我一直安慰自己晤愧,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贯吓,像睡著了一般蜀变。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上库北,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天醇锚,我揣著相機與錄音障簿,去河邊找鬼朽合。 笑死缭嫡,一個胖子當著我的面吹牛皆刺,可吹牛的內(nèi)容都是我干的凌摄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痴怨,長吁一口氣:“原來是場噩夢啊……” “哼屯伞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起珠移,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤钧惧,失蹤者是張志新(化名)和其女友劉穎勾习,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乾颁,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡艺栈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年湿右,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吭狡。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡丈莺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出般此,到底是詐尸還是另有隱情,我是刑警寧澤铐懊,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布科乎,位于F島的核電站,受9級特大地震影響茅茂,放射性物質(zhì)發(fā)生泄漏空闲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一逗噩、第九天 我趴在偏房一處隱蔽的房頂上張望跌榔。 院中可真熱鬧,春花似錦纲刀、人聲如沸担平。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暂论。三九已至耻台,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間空另,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工蹋砚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扼菠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓坝咐,卻偏偏與公主長得像循榆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墨坚,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容