Flutter URL识别插件url_recognizer的使用

Flutter URL识别插件url_recognizer的使用

url_recognizer 是一个用于在 Flutter 应用中识别和提取 URL 信息的插件。它支持多种社交平台的链接解析,并能够从链接中提取用户名、仓库名等信息。

安装

要使用此插件,首先需要将其添加到项目的 pubspec.yaml 文件中:

dependencies:
  ...
  url_recognizer: ^1.0.0

然后运行以下命令以安装依赖:

flutter pub get

示例代码

下面是一个完整的示例代码,展示了如何使用 url_recognizer 插件来识别和展示不同类型的社交平台链接。

示例代码

import 'package:flutter/material.dart';
import 'package:url_recognizer/url_recognizer.dart';
import 'package:url_recognizer_example/url_samples.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final List<SocialUrl> _recognizedSocials = List<SocialUrl>.empty(growable: true);

  @override
  void initState() {
    // 遍历预定义的链接样本并识别它们
    for (String socialLink in kUrlSamples) {
      SocialUrl? socialUrl = UrlRecognizer.findObject(url: socialLink);
      if (socialUrl != null) {
        _recognizedSocials.add(socialUrl);
      }
    }
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('URL Recognizer 示例'),
        ),
        body: SingleChildScrollView(
          child: Container(
            width: double.infinity,
            padding: const EdgeInsets.all(20),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: _recognizedSocials.map((SocialUrl e) => _SocialLinkPreview(socialUrl: e)).toList(),
            ),
          ),
        ),
      ),
    );
  }
}

// 自定义组件,用于显示识别后的链接信息
class _SocialLinkPreview extends StatelessWidget {
  final SocialUrl socialUrl;

  const _SocialLinkPreview({
    required this.socialUrl,
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(vertical: 10),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          // 显示原始链接
          Text(
            socialUrl.url,
            style: const TextStyle(
              color: Colors.blue,
            ),
          ),
          const SizedBox(height: 5),
          // 显示解析后的信息
          Container(
            padding: const EdgeInsets.all(8),
            color: Colors.grey.shade400,
            child: Row(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.start,
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                // 使用图标表示社交平台类型
                Icon(socialUrl.icon),
                const SizedBox(width: 8),
                // 显示平台名称和提取的信息
                Text('${socialUrl.title}: ${socialUrl.data}'),
              ],
            ),
          )
        ],
      ),
    );
  }
}

运行效果

运行上述代码后,您将看到一个列表,其中包含预定义的社交平台链接及其解析结果。例如:

  • 链接: https://github.com/lorey/social-media-profiles-regexs
  • 解析结果: Github: lorey/social-media-profiles-regexs

支持的链接类型

该插件支持以下类型的链接解析:

  • Email
  • Phone
  • Github
  • Instagram
  • Linkedin
  • Medium
  • Reddit
  • Skype
  • Snapchat
  • Telegram
  • Twitter
  • Youtube

使用样例

Facebook Profile

FacebookDetector().build('http://fb.com/peter_parker-miller');

结果:

FacebookProfile(
   profile: 'peter_parker-miller',
),

Facebook Profile By ID

FacebookDetector().build('https://www.facebook.com/profile.php?id=100004123456789');

结果:

FacebookProfileById(
   id: '100004123456789',
)

Github User

FacebookDetector().build('https://github.com/lorey');

结果:

GithubUser(
   login: 'lorey',
),

Github Repo

FacebookDetector().build('https://github.com/lorey/socials');

结果:

GithubRepo(
   login: 'lorey',
   repo: 'socials',
),

更多关于Flutter URL识别插件url_recognizer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter URL识别插件url_recognizer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


url_recognizer 是一个用于在 Flutter 应用中识别和解析 URL 的插件。它可以帮助你在文本中识别出 URL,并将其转换为可点击的链接。以下是如何使用 url_recognizer 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 url_recognizer 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  url_recognizer: ^1.0.0 # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的 Dart 文件中导入 url_recognizer 包:

import 'package:url_recognizer/url_recognizer.dart';

3. 使用 UrlRecognizer

url_recognizer 提供了一些工具来识别和解析 URL。以下是一些常见的使用场景:

3.1 识别文本中的 URL

你可以使用 UrlRecognizer 来识别文本中的 URL:

void main() {
  String text = "Visit my website at https://example.com and my GitHub at https://github.com.";
  
  List<UrlMatch> matches = UrlRecognizer.parse(text);
  
  for (UrlMatch match in matches) {
    print("Found URL: ${match.url}");
  }
}

3.2 解析 URL

你可以使用 UrlParser 来解析 URL:

void main() {
  String url = "https://example.com/path?query=123";
  
  UrlParsed parsedUrl = UrlParser.parse(url);
  
  print("Scheme: ${parsedUrl.scheme}");
  print("Host: ${parsedUrl.host}");
  print("Path: ${parsedUrl.path}");
  print("Query: ${parsedUrl.query}");
}

3.3 在 Flutter Widget 中使用

你可以将 url_recognizer 与 Flutter 的 Text Widget 结合使用,将文本中的 URL 转换为可点击的链接:

import 'package:flutter/material.dart';
import 'package:url_recognizer/url_recognizer.dart';
import 'package:url_launcher/url_launcher.dart';

class UrlText extends StatelessWidget {
  final String text;

  UrlText(this.text);

  [@override](/user/override)
  Widget build(BuildContext context) {
    List<UrlMatch> matches = UrlRecognizer.parse(text);

    List<TextSpan> spans = [];
    int start = 0;

    for (UrlMatch match in matches) {
      if (start < match.start) {
        spans.add(TextSpan(text: text.substring(start, match.start)));
      }

      spans.add(TextSpan(
        text: match.url,
        style: TextStyle(color: Colors.blue),
        recognizer: TapGestureRecognizer()
          ..onTap = () async {
            if (await canLaunch(match.url)) {
              await launch(match.url);
            }
          },
      ));

      start = match.end;
    }

    if (start < text.length) {
      spans.add(TextSpan(text: text.substring(start)));
    }

    return RichText(
      text: TextSpan(
        style: DefaultTextStyle.of(context).style,
        children: spans,
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      body: Center(
        child: UrlText("Visit my website at https://example.com and my GitHub at https://github.com."),
      ),
    ),
  ));
}
回到顶部