Skip to content

Instantly share code, notes, and snippets.

@bigzhu
Created September 16, 2019 03:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bigzhu/c40f86659b9fe97e0d77f36f8447a804 to your computer and use it in GitHub Desktop.
Save bigzhu/c40f86659b9fe97e0d77f36f8447a804 to your computer and use it in GitHub Desktop.
main.dart
import 'package:flutter/material.dart';
import 'package:flutter/gestures.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: 'Scroll Performance',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List words = [
"This",
"class",
"is",
"the ",
"configuration ",
"for ",
"the ",
"state. ",
"It ",
"holds ",
"the ",
"values ",
"(",
"in ",
"this",
"case",
"the ",
"title",
")",
" provided",
" by",
" the",
" parent",
" (",
"in",
" this",
" case",
" the",
" App",
" widget",
")",
".",
"\n"
];
@override
initState() {
super.initState();
words = List.from(words)..addAll(words);
words = List.from(words)..addAll(words);
words = List.from(words)..addAll(words);
words = List.from(words)..addAll(words);
words = List.from(words)..addAll(words);
}
@override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: SingleChildScrollView(child: ArticleRichText(words: words)),
// This trailing comma makes auto-formatting nicer for build methods.
);
}
}
class ArticleRichText extends StatefulWidget {
ArticleRichText({Key key, @required this.words}) : super(key: key);
final List words;
@override
ArticleRichTextState createState() => ArticleRichTextState();
}
class ArticleRichTextState extends State<ArticleRichText> {
MultiTapGestureRecognizer _getTapRecognizer(String word) {
if (word == "") return null;
return MultiTapGestureRecognizer()
..longTapDelay = Duration(milliseconds: 400)
..onLongTapDown = (i, detail) {
print("onLongTapDown");
}
..onTap = (i) {
print("onTap");
};
}
bool hasLetter(String str) {
RegExp regHasLetter = new RegExp(r"[a-zA-Z]+");
return regHasLetter.hasMatch(str);
}
TextSpan getTextSpan(String word) {
return TextSpan(
style: TextStyle(color: Colors.black87, fontFamily: "NotoSans-Medium", fontSize: 20),
text: hasLetter(word) ? " " : "",
children: [
hasLetter(word)
? TextSpan(text: word, recognizer: _getTapRecognizer(word))
: TextSpan(text: word),
word == "\n" ? TextSpan(text: " ") : TextSpan(text: "")
]);
}
@override
Widget build(BuildContext context) {
return RichText(
text: TextSpan(
text: ' ',
children: widget.words.map((d) {
return getTextSpan(d);
}).toList(),
),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment