-
-
Save putraxor/03ad59c117122b74155a77e5c101ff2a to your computer and use it in GitHub Desktop.
| import 'package:flutter/foundation.dart'; | |
| import 'package:flutter/gestures.dart'; | |
| import 'package:flutter/material.dart'; | |
| import 'package:url_launcher/url_launcher.dart' as launcher; | |
| ///TODO: check performance impact bro !!! | |
| class LinkTextSpan extends TextSpan { | |
| LinkTextSpan({TextStyle style, String url, String text}) | |
| : super( | |
| style: style, | |
| text: text ?? url, | |
| recognizer: new TapGestureRecognizer() | |
| ..onTap = () => launcher.launch(url)); | |
| } | |
| class RichTextView extends StatelessWidget { | |
| final String text; | |
| RichTextView({@required this.text}); | |
| bool _isLink(String input) { | |
| final matcher = new RegExp( | |
| r"(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)"); | |
| return matcher.hasMatch(input); | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| final _style = Theme.of(context).textTheme.body2; | |
| final words = text.split(' '); | |
| List<TextSpan> span = []; | |
| words.forEach((word) { | |
| span.add(_isLink(word) | |
| ? new LinkTextSpan( | |
| text: '$word ', | |
| url: word, | |
| style: _style.copyWith(color: Colors.blue)) | |
| : new TextSpan(text: '$word ', style: _style)); | |
| }); | |
| if (span.length > 0) { | |
| return new RichText( | |
| text: new TextSpan(text: '', children: span), | |
| ); | |
| } else { | |
| return new Text(text); | |
| } | |
| } | |
| } |
@ASemeniuk your comments are the rudest comments that I've read in quite a while. Shameful behaviour.
Sorry, everyone, I had a very bad day back then. After reading like 10 different sources with the same mistake over and over (where people were 100% positive they knew what they were doing) and being unable to find the correct solution I was looking for (about using multiple GestureRecognizers in ListView), I just wanted to share my pain with others. Not happy about the result myself...
Wonder if there is a way to make this work with newline characters as well. Doing
final words = text.split(' ').split('\n');
would get the links right, but would lose the structure of the original text.
lol this was a nice thread good code @ASemeniuk
@rfogar2 no that is wrong you cannot specify split('').split
No need to be rude though. Thank you Ardiansyan for providing helpful code.