Flutter文本解析插件flutter_parsed_text的使用
Flutter文本解析插件flutter_parsed_text的使用
Flutter Parsed text 是一个用于解析和提取文本中特定模式部分(如URL、电话号码、电子邮件等)的插件,它也支持正则表达式。
使用方法 💻
要在项目中使用这个插件,首先需要在pubspec.yaml
文件中添加flutter_parsed_text
作为依赖项:
dependencies:
flutter_parsed_text: ^latest_version # 请替换为最新版本号
然后,在Dart文件中导入包:
import 'package:flutter_parsed_text/flutter_parsed_text.dart';
参数说明 ⚙️
text
: 将要被解析并渲染的文本。style
: 用于设置所有非链接文本样式的TextStyle
对象。parse
: 包含MatchText
对象的数组,用于定义模式匹配结构。
MatchText 对象参数
type
: 预定义类型,可以是ParsedType.URL
,ParsedType.EMAIL
,ParsedType.PHONE
或者自定义类型ParsedType.CUSTOM
。pattern
: 自定义正则表达式字符串。regexOptions
: 正则表达式的选项配置。style
: 应用到匹配文本上的样式。renderText
: 当匹配到特定模式时返回显示文本与值的映射。onTap
: 点击事件触发后执行的动作。
例如,我们可以创建一个简单的MatchText
对象来处理电子邮件地址:
MatchText(
type: ParsedType.EMAIL,
style: TextStyle(color: Colors.red, fontSize: 24),
onTap: (url) {
launch("mailto:" + url);
},
)
对于更复杂的场景,比如用户提及(mention),我们可以通过正则表达式来匹配并处理:
MatchText(
pattern: r"\[(@[^:]+):([^\]]+)\]",
style: TextStyle(color: Colors.green, fontSize: 24),
renderText: ({required pattern, required str}) {
RegExp customRegExp = RegExp(r"\[(@[^:]+):([^\]]+)\]");
Match match = customRegExp.firstMatch(str)!;
return {'display': match.group(1)!};
},
onTap: (url) {
// 显示对话框提示用户点击了哪个提及
showDialog(...);
},
)
示例代码 ✍🏻
下面是一个完整的例子,展示了如何使用ParsedText
小部件来解析包含多种类型的文本,并为不同类型的文本提供不同的样式和交互行为:
import 'package:flutter/material.dart';
import 'package:flutter_parsed_text/flutter_parsed_text.dart';
import 'package:url_launcher/url_launcher.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Example App',
home: MainApp(),
);
}
}
class MainApp extends StatefulWidget {
@override
_MainAppState createState() => _MainAppState();
}
class _MainAppState extends State<MainApp> {
final parseRules = <MatchText>[
// 解析邮件地址
MatchText(
type: ParsedType.EMAIL,
style: TextStyle(color: Colors.red, fontSize: 24),
onTap: (email) async {
await launch("mailto:$email");
},
),
// 解析URL
MatchText(
type: ParsedType.URL,
style: TextStyle(color: Colors.blue, fontSize: 24),
onTap: (url) async {
if (await canLaunch(url)) {
await launch(url);
}
},
),
// 解析电话号码
MatchText(
type: ParsedType.PHONE,
style: TextStyle(color: Colors.red, fontSize: 24),
onTap: (phone) async {
await launch("tel:$phone");
},
),
// 解析用户提及
MatchText(
pattern: r"\[(@[^:]+):([^\]]+)\]",
style: TextStyle(color: Colors.green, fontSize: 24),
renderText: ({required pattern, required str}) {
RegExp customRegExp = RegExp(r"\[(@[^:]+):([^\]]+)\]");
Match match = customRegExp.firstMatch(str)!;
return {'display': match.group(1)!};
},
onTap: (mention) {
// 弹出对话框通知用户点击了哪个提及
showDialog(
context: context,
builder: (_) => AlertDialog(
title: Text('Mention Clicked'),
content: Text('${mention.split(':')[0]} clicked.'),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('Close'),
),
],
),
);
},
),
// 解析话题标签
MatchText(
pattern: r"\B#+([\w]+)\b",
style: TextStyle(color: Colors.pink, fontSize: 24),
onTap: (hashtag) {
// 弹出对话框通知用户点击了哪个话题标签
showDialog(
context: context,
builder: (_) => AlertDialog(
title: Text('Hashtag Clicked'),
content: Text('$hashtag clicked.'),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('Close'),
),
],
),
);
},
),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Parsed Text Example')),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: ParsedText(
text: "[@michael:51515151] Hello this is an example of the ParsedText, links like http://www.google.com or http://www.facebook.com are clickable and phone number 444-555-6666 can call too. But you can also do more with this package, for example Bob will change style and David too. foo@gmail.com And the magic number is 42! #react #react-native",
parse: parseRules,
style: TextStyle(fontSize: 18),
),
),
);
}
}
这段代码实现了对文本中的邮箱、网址、电话号码、用户提及以及话题标签的支持,并且为每个类型设置了不同的样式和点击事件。你可以根据自己的需求调整规则列表parseRules
中的内容。
更多关于Flutter文本解析插件flutter_parsed_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter文本解析插件flutter_parsed_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter文本解析插件flutter_parsed_text
的示例代码。这个插件允许你解析和渲染富文本内容,非常适合用于显示带有不同样式(如粗体、斜体、链接等)的文本。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_parsed_text
依赖:
dependencies:
flutter:
sdk: flutter
flutter_parsed_text: ^2.0.0 # 请根据需要检查最新版本
然后,运行flutter pub get
来安装依赖。
接下来,是一个简单的示例代码,展示如何使用flutter_parsed_text
插件:
import 'package:flutter/material.dart';
import 'package:flutter_parsed_text/flutter_parsed_text.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Parsed Text Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 定义一个包含不同样式文本的字符串
String parsedText = """
Hello [bold]World[/bold]! Welcome to [italic]Flutter[/italic] parsed text example.
Visit our [url]website[/url] for more info.
""";
// 使用ParsedText.fromJson方法解析并渲染文本
return Scaffold(
appBar: AppBar(
title: Text('Flutter Parsed Text Example'),
),
body: Center(
child: ParsedText.fromJson(
ParsedTextData(
text: parsedText,
style: TextStyle(fontSize: 18),
linksStyle: TextStyle(color: Colors.blue, decoration: TextDecoration.underline),
bold: (textStyle) => textStyle.copyWith(fontWeight: FontWeight.bold),
italic: (textStyle) => textStyle.copyWith(fontStyle: FontStyle.italic),
url: (url, textStyle, onTap) {
return GestureDetector(
onTap: () {
// 处理URL点击事件,例如打开浏览器
// 这里为了简单起见,只打印URL
print('Opening URL: $url');
},
child: Text(
url,
style: textStyle.copyWith(color: Colors.blue, decoration: TextDecoration.underline),
),
);
},
),
),
),
);
}
}
在这个示例中:
- 我们定义了一个包含不同样式标记(如
[bold]
、[/bold]
、[italic]
、[/italic]
和[url]
)的字符串parsedText
。 - 使用
ParsedText.fromJson
方法来解析这个字符串,并应用相应的样式。 ParsedTextData
类允许我们配置文本的基本样式(如字体大小)、链接样式,以及如何处理粗体、斜体和URL点击事件。- 对于URL点击事件,我们使用
GestureDetector
来捕获点击并处理(在这个例子中,只是打印URL)。
运行这个示例应用,你会看到一个包含不同样式文本的界面,点击链接会在控制台打印URL。
这个示例展示了flutter_parsed_text
插件的基本用法,你可以根据需要进一步自定义和扩展。