Flutterウィジェットでハイパーリンクを作成するにはどうすればよいですか?


103

Flutterアプリに表示するハイパーリンクを作成したいと思います。

ハイパーリンクは、次のTextようなまたは同様のテキストビューに埋め込む必要があります。

The last book bought is <a href='#'>this</a>

これを行うためのヒントはありますか?

回答:


168

InkWellをTextウィジェットにラップし、(サービスライブラリからの)UrlLauncherをonTap属性に指定するだけです。以下で使用する前に、UrlLauncherをFlutterパッケージとしてインストールしてください

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


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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('UrlLauchner'),
        ),
        body: new Center(
          child: new InkWell(
              child: new Text('Open Browser'),
              onTap: () => launch('https://docs.flutter.io/flutter/services/UrlLauncher-class.html')
          ),
        ),
      ),
    );
  }
}

テキストウィジェットにスタイルを指定して、リンクのように見せることができます。

更新

問題を少し調べた後、私はあなたが要求した「インライン」ハイパーリンクを実装するための別の解決策を見つけました。囲まれたTextSpansでRichTextウィジェットを使用できます。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('UrlLauchner'),
        ),
        body: new Center(
          child: new RichText(
            text: new TextSpan(
              children: [
                new TextSpan(
                  text: 'This is no Link, ',
                  style: new TextStyle(color: Colors.black),
                ),
                new TextSpan(
                  text: 'but this is',
                  style: new TextStyle(color: Colors.blue),
                  recognizer: new TapGestureRecognizer()
                    ..onTap = () { launch('https://docs.flutter.io/flutter/services/UrlLauncher-class.html');
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

このようにして、実際に1つの単語を強調表示し、それからハイパーリンクを作成できます;)


7
UrlLauncherはフラッターの一部ではなくなり、プラグインに移動され、APIが変更されました
Josef Adamcik 2018年

7
また、インポートを追加する必要があります。import'package:flutter / gestures.dart '; import'package:url_launcher / url_launcher.dart ';
Alex Pliutau 2018

5
あなたはあなたのライフサイクルをTapGestureRecognizer正しく扱っていません。が使用されなくなったら、dispose()メソッドを呼び出す必要がありますRichText。ここを参照してください:api.flutter.dev/flutter/painting/TextSpan/recognizer.html
AlexSemeniuk19年

@AlexSemeniukあなたの例では、彼らはStatefulWidgetを使用していますが、上記の回答では、StatelessWidgetです。StatelessWidgetのケースを処理する必要がありますか?
コーリー・コール

2
@CoreyColeStatelessWidgetはあなたのTapGestureRecognizerために魔法のようにあなたを処分しません。実際、StatelessWidgetこのシナリオでの使用は正しくありません。これは、rsourceをこの方法で破棄できないためです。はい、停止する必要のある内部タイマーを実行するため、絶対にのdispose()メソッドを呼び出す必要がTapGestureRecognizerあります。
AlexSemeniuk19年

49

Flutterにはハイパーリンクのサポートが組み込まれていませんが、自分で偽造することができます。ギャラリーのdrawer.dartに例があります。タップを処理する属性を持つRichText色付きのウィジェットを使用します。TextSpanrecognizer

        RichText(
          text: TextSpan(
            children: [
              TextSpan(
                style: bodyTextStyle,
                text: seeSourceFirst,
              ),
              TextSpan(
                style: bodyTextStyle.copyWith(
                  color: colorScheme.primary,
                ),
                text: repoText,
                recognizer: TapGestureRecognizer()
                  ..onTap = () async {
                    final url = 'https://github.com/flutter/gallery/';
                    if (await canLaunch(url)) {
                      await launch(
                        url,
                        forceSafariVC: false,
                      );
                    }
                  },
              ),
              TextSpan(
                style: bodyTextStyle,
                text: seeSourceSecond,
              ),
            ],
          ),

ハイパーリンク ブラウザ


ありがとう。しかし、これは実際には私が探しているものではありません。私はアプリ内ナビゲーションを超えて探しています。
TaylorR 2017

「アプリ内ナビゲーションの先を見る」とはどういう意味かわかりません。リンクでブラウザを開きますか?
コリンジャクソン

はい、クリックしてブラウズで開くことができるリンクなど。
TaylorR 2017

1
それが私がリンクしたサンプルが行うことです。私はそれを示すために答えにいくつかの写真を追加しました。
コリンジャクソン

リポジトリのリンクが壊れています
MichelFeinstein20年

41

ラップTextインGestureDetectorしてクリックインを処理できますonTap()

GestureDetector(
  child: Text("Click here", style: TextStyle(decoration: TextDecoration.underline, color: Colors.blue)),
  onTap: () {
    // do what you need to do when "Click here" gets clicked
  }
)

ここに画像の説明を入力してください


あなたはあなたのソリューションが他人よりも少ないラインを持って、右ですが、アルは少なくとも意味的に私はそれが最善の解決策だと思うので、インクウェルは、このespecific仕事のためのウィジェットです
dmarquina

2
@dmarquinaはい、のInkWell代わりに使用できますGestureDetector
CopsOnRoad

9

リンクのように見せたい場合は、下線を追加できます。

new Text("Hello Flutter!", style: new TextStyle(color: Colors.blue, decoration: TextDecoration.underline),)

そして結果:

ここに画像の説明を入力してください


クリックできません!
atilkan

次に、ボタンウィジェットでラップします。:)
bartektartanus

8

パッケージflutter_linkifyを使用できます
https://pub.dev/packages/flutter_linkify
別のオプションを提供したいだけです。
パッケージはテキストを分割し、http / httpsを自動的に強調表示します
プラグインurl_launcherを結合してURLを起動
できます以下の例を確認できます。

ここに画像の説明を入力してください

以下の完全なコード

import 'package:flutter/material.dart';
import 'package:flutter_linkify/flutter_linkify.dart';
import 'dart:async';

import 'package:url_launcher/url_launcher.dart';

void main() => runApp(new LinkifyExample());

class LinkifyExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'flutter_linkify example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('flutter_linkify example'),
        ),
        body: Center(
          child: Linkify(
            onOpen: _onOpen,
            text: "Made by https://cretezy.com \n\nMail: example@gmail.com \n\n  this is test http://pub.dev/ ",
          ),
        ),
      ),
    );
  }

  Future<void> _onOpen(LinkableElement link) async {
    if (await canLaunch(link.url)) {
      await launch(link.url);
    } else {
      throw 'Could not launch $link';
    }
  }
}

同じウィジェットに2つのリンクを設定するにはどうすればよいですか?たとえば、「これをクリックすると、利用規約とプライバシーポリシーに同意したことになります」のように、それらをまとめる必要があります
Dani

1

クリック可能なリンクをアプリに配置する別の(またはそうでない)方法 (私にとっては、そのように機能しました):

1-pubspec.yamlファイルにurl_launcherパッケージを追加します

(パッケージバージョン5.0は私にはうまく機能しなかったので、4.2.0 + 3を使用しています)。

dependencies:
  flutter:
    sdk: flutter
  url_launcher: ^4.2.0+3

2-それをインポートして、以下のように使用します。

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

void main() {
  runApp(MaterialApp(
    title: 'Navigation Basics',
    home: MyUrl(),
  ));
}

class MyUrl extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Url Launcher'),
      ),
      body: Center(
        child: FlatButton(
          onPressed: _launchURL,
          child: Text('Launch Google!',
              style: TextStyle(fontSize: 17.0)),
        ),
      ),
    );
  }

  _launchURL() async {
    const url = 'https://google.com.br';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }
}

必要があるいくつかのテキストの間のハイパーリンクをする場合は、使用することができますFlatButtonので... TextDecoration.underlineがbartektartanusとして上記示したwhithそれをフォーマットし、あなたの文章の残りの部分と同じ背景とテキストの色で
Fellipeサンチェス

1

リンクテキストhttps://pub.dev/packages/link_text を使用して、次のように使用できます。

 final String _text = 'Lorem ipsum https://flutter.dev\nhttps://pub.dev'; 
 @override
 Widget build(BuildContext context) {
 return Scaffold(
     body: Center(
      child: LinkText(
        text: _text,
        textAlign: TextAlign.center,
      ),
    ),
  );
}

Linuxflutter pub getでは失敗しますUnable to find a plugin.vcxproj for plugin "url_launcher_windows"
EugeneGr。Philippov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.