From 7014ded7f0c65cea0a44f2b343d20498e1635ad8 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Thu, 16 Apr 2020 12:18:39 +0200 Subject: [PATCH] Optimize parsing --- lib/ui/widgets/text_widget.dart | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/ui/widgets/text_widget.dart b/lib/ui/widgets/text_widget.dart index f1602fa..e600ead 100644 --- a/lib/ui/widgets/text_widget.dart +++ b/lib/ui/widgets/text_widget.dart @@ -11,7 +11,7 @@ import 'package:url_launcher/url_launcher.dart'; /// /// @author Pierre Hubert -class TextWidget extends StatelessWidget { +class TextWidget extends StatefulWidget { final String content; final bool parseBBcode; final TextStyle style; @@ -25,26 +25,40 @@ class TextWidget extends StatelessWidget { assert(parseBBcode != null), super(key: key); + @override + _TextWidgetState createState() => _TextWidgetState(); +} + +class _TextWidgetState extends State { + Widget _cache; + @override Widget build(BuildContext context) { - var content = EmojiParser().emojify(this.content); + if (_cache == null) _cache = doBuild(); + + return _cache; + } + + Widget doBuild() { + var content = EmojiParser().emojify(this.widget.content); // Parse BBcode - if (this.parseBBcode) + if (this.widget.parseBBcode) return BBCodeParsedWidget( text: content, - parseCallback: (style, text) => _parseLinks(context, text, style), + parseCallback: (style, text) => _parseLinks(text, style), ); // Just parse link return RichText( - text: TextSpan(children: _parseLinks(context, content, style)), + text: TextSpan(children: _parseLinks(content, widget.style)), ); } /// Sub parse function - List _parseLinks( - BuildContext context, String text, TextStyle style) { + List _parseLinks(String text, TextStyle style) { + if (style == null) style = TextStyle(); + var buff = StringBuffer(); final list = new List();