Flutter链接跳转管理插件link_target的使用

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

Flutter链接跳转管理插件link_target的使用

添加了在浏览器页面底部左侧显示的超链接预览行为。可以在所有平台上安全使用,无需担心因平台检查而抛出异常。

开始使用

在你的项目pubspec.yaml文件中添加link_target依赖:

dart pub add link_target

在你的Dart代码中导入该库:

import 'package:link_target/link_target.dart';

确保将你的Material home小部件包裹在LinkTargetRegion中。

代码示例

以下是一个简单的示例,展示了如何使用LinkTargetDetector来创建可点击的链接:

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

class MyAppInkwellOrGestureDetector extends StatelessWidget {
  const MyAppInkwellOrGestureDetector({super.key});
  
  [@override](/user/override)
  Widget build(BuildContext context) {
    return LinkTargetDetector(
      target: 'https://dart.dev/', // 链接目标
      child: GestureDetector( // 可以换成InkWell
        child: Text('Glance dart.dev\'s link'), // 显示的文字
      ),
    );
  }
}

你可以查看example目录下的演示应用,以获取完整的示例代码。

完整示例代码

下面是一个更完整的示例,展示了如何在一个Flutter应用中使用link_target插件:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    final titleMedium = Theme.of(context).textTheme.titleMedium;
    return MaterialApp(
      title: 'Link Target Example',
      home: LinkTargetRegion( // 包裹整个MaterialApp
        child: Scaffold(
          body: Center(
            child: Stack(
              children: [
                Center(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisSize: MainAxisSize.min,
                    children: [
                      LinkTargetDetector(
                        target: 'https://github.com/flutter/flutter', // 第一个链接
                        child: Text(
                          'Glance flutter\'s repo link',
                          style: titleMedium,
                        ),
                      ),
                      LinkTargetDetector(
                        target: 'https://flutter.dev/development', // 第二个链接
                        child: Text(
                          'Glance flutter.dev\'s link',
                          style: titleMedium,
                        ),
                      ),
                      LinkTargetDetector(
                        target: 'https://dart.dev/', // 第三个链接
                        child: Text(
                          'Glance dart.dev\'s link',
                          style: titleMedium,
                        ),
                      ),
                      LinkTargetDetector(
                        target: 'https://www.youtube.com/@flutterdev', // 第四个链接
                        child: Text(
                          'Glance Flutter YouTube\'s link',
                          style: titleMedium,
                        ),
                      ),
                    ],
                  ),
                ),
                const Positioned(
                  left: 10.0,
                  bottom: 10.0,
                  child: Icon(Icons.arrow_downward, size: 150.0), // 附加图标
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter链接跳转管理插件link_target的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter链接跳转管理插件link_target的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用link_target插件进行链接跳转管理的代码示例。link_target插件允许你指定链接是在WebView中打开还是在系统默认的浏览器中打开。不过需要注意的是,link_target并不是一个官方或广泛认可的Flutter插件名称,这里我们假设你指的是在WebView组件中处理链接跳转的逻辑,通常这可以通过webview_flutter插件实现。

首先,确保你已经在pubspec.yaml文件中添加了webview_flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  webview_flutter: ^3.0.4  # 请使用最新版本

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

接下来,我们创建一个简单的Flutter应用,其中包含一个WebView组件,并处理链接跳转逻辑。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WebView Link Target Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WebViewExample(),
    );
  }
}

class WebViewExample extends StatefulWidget {
  @override
  _WebViewExampleState createState() => _WebViewExampleState();
}

class _WebViewExampleState extends State<WebViewExample> {
  late WebViewController _controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebView Link Target Example'),
      ),
      body: WebView(
        initialUrl: 'https://flutter.dev',
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (WebViewController webViewController) {
          _controller = webViewController;
          _controller.setNavigationDelegate(
            NavigationDelegate(
              onPageStarted: (String url) {
                print("Page started loading: $url");
              },
              onPageFinished: (String url) {
                print("Page finished loading: $url");
              },
              shouldOverrideUrlLoading: (NavigationRequest request) async {
                // 在这里处理链接跳转逻辑
                // 如果希望链接在系统浏览器中打开,则返回 false
                // 如果希望在 WebView 中打开,则返回 true
                if (request.url!.startsWith('https://flutter.dev')) {
                  return NavigationDecision.navigate;
                } else {
                  // 打开系统浏览器
                  if (await canLaunch(request.url!)) {
                    await launch(request.url!);
                    return NavigationDecision.prevent;
                  }
                }
                return NavigationDecision.navigate;
              },
            ),
          );
        },
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

在这个示例中,我们使用了webview_flutter插件来嵌入一个WebView,并设置了NavigationDelegate来处理链接跳转逻辑。shouldOverrideUrlLoading回调允许我们检查即将加载的URL,并根据需要决定是在WebView中打开还是使用系统浏览器打开。

注意,为了使用launch函数打开系统浏览器,你需要在文件顶部添加以下导入:

import 'package:url_launcher/url_launcher.dart';

并确保在pubspec.yaml中添加url_launcher依赖:

dependencies:
  url_launcher: ^6.0.12  # 请使用最新版本

这个示例展示了基本的链接跳转管理逻辑,你可以根据实际需求进一步定制。

回到顶部