Flutter URL启动插件url_launcher_tizen的使用

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

Flutter URL启动插件url_launcher_tizen的使用

pub package

url_launcher_tizenurl_launcher 在 Tizen 平台上的实现。

使用

该插件不是 url_launcher 的官方实现。因此,在你的 pubspec.yaml 文件中,你必须同时包含 url_launcherurl_launcher_tizen 作为依赖项:

dependencies:
  url_launcher: ^6.3.1
  url_launcher_tizen: ^2.1.3

然后在 Dart 代码中导入 url_launcher

import 'package:url_launcher/url_launcher.dart';

详细的使用方法可以参考 url_launcher 的文档

必需的权限

要在 Tizen 应用程序中使用此插件,你需要应用管理器权限。在你的 tizen-manifest.xml 文件中的 <manifest> 部分添加以下行:

<privileges>
  <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
</privileges>

有关 Tizen 权限的详细信息,请参阅 Tizen 文档:API 权限

注意事项

  • 如果设备上没有应用程序可以打开提供的 URL,则会抛出 PlatformException
  • 在 Tizen 上仅支持默认启动模式 (LaunchMode.platformDefault)。

完整示例代码

以下是一个完整的示例代码,展示了如何使用 url_launcher_tizen 插件来启动不同类型的 URL。

// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ignore_for_file: public_member_api_docs

import 'dart:async';

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'URL Launcher',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'URL Launcher'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _hasCallSupport = false;
  Future<void>? _launched;
  String _phone = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    // 检查电话呼叫支持。
    canLaunchUrl(Uri(scheme: 'tel', path: '123')).then((bool result) {
      setState(() {
        _hasCallSupport = result;
      });
    });
  }

  Future<void> _launchInBrowser(Uri url) async {
    if (!await launchUrl(
      url,
      mode: LaunchMode.externalApplication,
    )) {
      throw Exception('Could not launch $url');
    }
  }

  Future<void> _launchInBrowserView(Uri url) async {
    if (!await launchUrl(url, mode: LaunchMode.inAppBrowserView)) {
      throw Exception('Could not launch $url');
    }
  }

  Future<void> _launchInWebView(Uri url) async {
    if (!await launchUrl(url, mode: LaunchMode.inAppWebView)) {
      throw Exception('Could not launch $url');
    }
  }

  Future<void> _launchInAppWithBrowserOptions(Uri url) async {
    if (!await launchUrl(
      url,
      mode: LaunchMode.inAppBrowserView,
      browserConfiguration: const BrowserConfiguration(showTitle: true),
    )) {
      throw Exception('Could not launch $url');
    }
  }

  Future<void> _launchAsInAppWebViewWithCustomHeaders(Uri url) async {
    if (!await launchUrl(
      url,
      mode: LaunchMode.inAppWebView,
      webViewConfiguration: const WebViewConfiguration(
          headers: {'my_header_key': 'my_header_value'}),
    )) {
      throw Exception('Could not launch $url');
    }
  }

  Future<void> _launchInWebViewWithoutJavaScript(Uri url) async {
    if (!await launchUrl(
      url,
      mode: LaunchMode.inAppWebView,
      webViewConfiguration: const WebViewConfiguration(enableJavaScript: false),
    )) {
      throw Exception('Could not launch $url');
    }
  }

  Future<void> _launchInWebViewWithoutDomStorage(Uri url) async {
    if (!await launchUrl(
      url,
      mode: LaunchMode.inAppWebView,
      webViewConfiguration: const WebViewConfiguration(enableDomStorage: false),
    )) {
      throw Exception('Could not launch $url');
    }
  }

  Future<void> _launchUniversalLinkIOS(Uri url) async {
    final bool nativeAppLaunchSucceeded = await launchUrl(
      url,
      mode: LaunchMode.externalNonBrowserApplication,
    );
    if (!nativeAppLaunchSucceeded) {
      await launchUrl(
        url,
        mode: LaunchMode.inAppBrowserView,
      );
    }
  }

  Widget _launchStatus(BuildContext context, AsyncSnapshot<void> snapshot) {
    if (snapshot.hasError) {
      return Text('Error: ${snapshot.error}');
    } else {
      return const Text('');
    }
  }

  Future<void> _makePhoneCall(String phoneNumber) async {
    final Uri launchUri = Uri(
      scheme: 'tel',
      path: phoneNumber,
    );
    await launchUrl(launchUri);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 按钮点击事件不依赖于 'canLaunch' 检查,因为假设每个设备都可以打开网络 URL。
    final Uri toLaunch =
        Uri(scheme: 'https', host: 'www.cylog.org', path: 'headers/');
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView(
        children: [
          Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Padding(
                padding: const EdgeInsets.all(16.0),
                child: TextField(
                    onChanged: (String text) => _phone = text,
                    decoration: const InputDecoration(
                        hintText: '输入要拨打的电话号码')),
              ),
              ElevatedButton(
                onPressed: _hasCallSupport
                    ? () => setState(() {
                          _launched = _makePhoneCall(_phone);
                        })
                    : null,
                child: _hasCallSupport
                    ? const Text('拨打电话')
                    : const Text('不支持拨打电话'),
              ),
              Padding(
                padding: const EdgeInsets.all(16.0),
                child: Text(toLaunch.toString()),
              ),
              ElevatedButton(
                onPressed: () => setState(() {
                  _launched = _launchInBrowser(toLaunch);
                }),
                child: const Text('在浏览器中打开'),
              ),
              const Padding(padding: EdgeInsets.all(16.0)),
              ElevatedButton(
                onPressed: () => setState(() {
                  _launched = _launchInBrowserView(toLaunch);
                }),
                child: const Text('在应用中打开'),
              ),
              ElevatedButton(
                onPressed: () => setState(() {
                  _launched = _launchAsInAppWebViewWithCustomHeaders(toLaunch);
                }),
                child: const Text('在应用中打开(自定义头部)'),
              ),
              ElevatedButton(
                onPressed: () => setState(() {
                  _launched = _launchInWebViewWithoutJavaScript(toLaunch);
                }),
                child: const Text('在应用中打开(禁用 JavaScript)'),
              ),
              ElevatedButton(
                onPressed: () => setState(() {
                  _launched = _launchInWebViewWithoutDomStorage(toLaunch);
                }),
                child: const Text('在应用中打开(禁用 DOM 存储)'),
              ),
              const Padding(padding: EdgeInsets.all(16.0)),
              ElevatedButton(
                onPressed: () => setState(() {
                  _launched = _launchUniversalLinkIOS(toLaunch);
                }),
                child: const Text('在原生应用中打开通用链接,失败则转到 Safari。(YouTube)'),
              ),
              const Padding(padding: EdgeInsets.all(16.0)),
              ElevatedButton(
                onPressed: () => setState(() {
                  _launched = _launchInWebView(toLaunch);
                  Timer(const Duration(seconds: 5), () {
                    closeInAppWebView();
                  });
                }),
                child: const Text('在应用中打开 + 5秒后关闭'),
              ),
              const Padding(padding: EdgeInsets.all(16.0)),
              ElevatedButton(
                onPressed: () => setState(() {
                  _launched = _launchInAppWithBrowserOptions(toLaunch);
                }),
                child: const Text('在应用中打开并显示标题'),
              ),
              const Padding(padding: EdgeInsets.all(16.0)),
              Link(
                uri: Uri.parse(
                    'https://pub.dev/documentation/url_launcher/latest/link/link-library.html'),
                target: LinkTarget.blank,
                builder: (BuildContext ctx, FollowLink? openLink) {
                  return TextButton.icon(
                    onPressed: openLink,
                    label: const Text('链接组件文档'),
                    icon: const Icon(Icons.read_more),
                  );
                },
              ),
              const Padding(padding: EdgeInsets.all(16.0)),
              FutureBuilder<void>(future: _launched, builder: _launchStatus),
            ],
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter Tizen应用中使用url_launcher_tizen插件来启动URL的示例代码。

首先,确保你已经在你的Flutter项目中添加了url_launcherurl_launcher_tizen依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  url_launcher: ^6.0.0  # 请检查最新版本号
  url_launcher_tizen: ^0.1.0  # 请检查最新版本号

然后,运行flutter pub get来安装这些依赖。

接下来,你需要配置Tizen项目。由于url_launcher_tizen是一个平台特定的插件,你需要确保在Tizen设备上正确配置。不过,对于大多数用例,只需要添加依赖即可,因为url_launcher_tizen已经处理了大部分平台特定的逻辑。

现在,让我们编写一些Flutter代码来使用url_launcher插件在Tizen设备上启动一个URL。

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: 'URL Launcher Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('URL Launcher Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _launchURL,
          child: Text('Launch URL'),
        ),
      ),
    );
  }

  _launchURL() async {
    const url = 'https://www.flutter.dev';
    if (await canLaunchUrl(Uri.parse(url))) {
      await launchUrl(Uri.parse(url));
    } else {
      throw 'Could not launch $url';
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。当用户点击按钮时,应用将尝试启动指定的URL。canLaunchUrl函数用于检查设备是否能够处理该URL,而launchUrl函数则用于实际启动URL。

请注意,从url_launcher 6.0.0版本开始,launch函数已被launchUrl函数取代,并且需要使用Uri对象而不是字符串来表示URL。

最后,确保你的Tizen设备已经连接,并且你已经按照Flutter的文档配置了Tizen开发环境。然后,你可以使用flutter run -d <your-tizen-device-id>命令来运行你的应用并测试URL启动功能。

希望这个示例对你有所帮助!

回到顶部