Flutter URI处理插件uri的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter URI处理插件uri的使用

Flutter 中的URI处理不仅仅局限于简单的字符串拼接,Dart提供了强大的工具来解析和生成URI。这使得在构建现代应用时,如需要处理网络请求、深度链接或路由导航等场景下更加得心应手。本文将详细介绍uri.dart库中几个重要的类:UriPattern, UriMatch, UriTemplate, UriParserUriBuilder,并给出一个完整的示例demo。

UriPattern

UriPattern接口用于匹配和解析URIs,类似于字符串的Pattern。它定义了两个方法:

  • bool matches(Uri uri):判断给定的Uri是否符合模式。
  • UriMatch match(Uri uri):返回从Uri中解析出来的参数信息。

UriMatch

当调用UriPattern.match()时会得到一个UriMatch对象。该对象包含从URI中解析出的参数以及解析后剩余的部分。这对于解析具有层级关系的相对URI非常有用。

UriTemplate

UriTemplate实现了RFC 6570 URI Templates规范。URI模板允许我们通过数据动态生成URI。创建一个模板字符串后,可以通过传入具体的数据进行扩展以生成最终的URI。

示例代码

import 'package:uri/uri.dart';

void main() {
  var template = UriTemplate("http://example.com/~{user}/");
  String fredUri = template.expand({'user': 'fred'});
  print(fredUri); // 输出: http://example.com/~fred/
}

模板语法

URI模板由固定部分和可变部分组成。可变部分用花括号{}包围表示表达式。表达式可以包含操作符(可选)和逗号分隔的变量说明列表。每个变量说明由变量名及其修饰符(可选)构成。

示例

  • http://example.com/~{username}/
  • http://example.com/dictionary/{term:1}/{term}
  • http://example.com/search{?q,lang}

操作符

操作符 描述
简单字符串扩展
+ 保留字符扩展
# 片段扩展
. 标签扩展,点前缀
/ 路径段,斜杠前缀
; 路径样式参数,分号前缀
? 表单样式查询,与号分隔
& 表单样式查询续接

修饰符

修饰符 描述
默认扩展
:n 前缀:仅使用值的前n个字符
* “爆炸”列表和映射为多个键值对

UriParser

UriParser根据UriTemplate解析URIs,并基于模板中定义的变量提取参数。需要注意的是,由于URI模板设计之初并不是为了便于解析,因此只有有限的一部分模板支持解析功能。对于解析的支持有一些限制条件,比如组件必须按顺序出现且每个组件只能出现一次等。

UriBuilder

UriBuilder是一个可变容器,用于逐步构建URI。它可以方便地添加或修改各个URI组成部分,直到构建完成。


完整示例Demo

下面提供了一个更复杂的例子,展示了如何利用这些工具实现动态生成API请求URL的功能:

import 'package:flutter/material.dart';
import 'package:uri/uri.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('URI Handling Demo')),
        body: Center(child: GenerateUrlButton()),
      ),
    );
  }
}

class GenerateUrlButton extends StatefulWidget {
  @override
  _GenerateUrlButtonState createState() => _GenerateUrlButtonState();
}

class _GenerateUrlButtonState extends State<GenerateUrlButton> {
  String generatedUrl = '';

  void _generateUrl() {
    // Define a template for an API endpoint that takes user ID and action as parameters
    final template = UriTemplate('https://api.example.com/v1/users/{userId}/{action}');
    
    // Data to be expanded into the URL
    final Map<String, dynamic> variables = {
      'userId': '12345',
      'action': 'profile'
    };

    // Expand the template with provided data
    final url = template.expand(variables);
    
    setState(() {
      generatedUrl = url;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: _generateUrl,
          child: Text('Generate URL'),
        ),
        SizedBox(height: 20),
        Text(generatedUrl.isEmpty ? 'Click above to generate a URL' : generatedUrl),
      ],
    );
  }
}

此代码片段演示了如何在Flutter应用程序中使用UriTemplate来自动生成API请求URL,并将其显示给用户。当点击按钮时,程序会根据预定义的模板和提供的数据生成一个新的URL,并更新界面上的文字内容。


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

1 回复

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


在处理Flutter应用中的URI时,uri_launcher 是一个非常有用的插件。尽管没有一个直接名为 uri 的官方插件,但通常我们会使用 url_launcher 插件来打开外部URI(如网页链接、邮件、电话等)。下面是如何在Flutter应用中使用 url_launcher 插件来处理URI的一个示例。

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

dependencies:
  flutter:
    sdk: flutter
  url_launcher: ^6.0.15  # 请检查最新版本号

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

接下来,在你的 Dart 文件中,你可以这样使用 url_launcher 来处理URI:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'URI Launcher Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('URI Launcher Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _launchWebsite,
              child: Text('Launch Website'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _launchEmail,
              child: Text('Launch Email'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _launchPhone,
              child: Text('Launch Phone Call'),
            ),
          ],
        ),
      ),
    );
  }

  _launchWebsite() async {
    const url = 'https://flutter.dev';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }

  _launchEmail() async {
    const email = 'mailto:example@example.com';
    if (await canLaunch(email)) {
      await launch(email);
    } else {
      throw 'Could not launch $email';
    }
  }

  _launchPhone() async {
    const phoneNumber = 'tel:+1234567890';
    if (await canLaunch(phoneNumber)) {
      await launch(phoneNumber);
    } else {
      throw 'Could not launch $phoneNumber';
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它有三个按钮,分别用于打开网站、发送电子邮件和拨打电话。每个按钮的点击事件都调用了一个私有方法,这些方法使用 url_launcher 插件的 launch 函数来打开相应的URI。在尝试打开URI之前,我们使用 canLaunch 函数来检查设备是否能够处理该URI。

注意:在实际应用中,处理URI时应考虑安全性和用户隐私,特别是在处理电话和电子邮件URI时,确保用户同意执行这些操作。

回到顶部