Flutter 위젯에서 하이퍼 링크를 만드는 방법은 무엇입니까?


103

Flutter 앱에 표시 할 하이퍼 링크를 만들고 싶습니다.

하이퍼 링크는 다음 Text과 같은 또는 유사한 텍스트보기에 포함되어야합니다 .

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

이 작업에 대한 힌트가 있습니까?

답변:


169

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');
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

이렇게하면 실제로 한 단어를 강조 표시하고 그 단어로 하이퍼 링크를 만들 수 있습니다.)


7
UrlLauncher는 더 이상 flutter의 일부가 아니며 플러그인 으로 이동 되었으며 API가 변경되었습니다 .
Josef Adamcik

7
또한 import를 추가해야합니다 : import 'package : flutter / gestures.dart'; import 'package : url_launcher / url_launcher.dart';
Alex Pliutau

5
당신은 당신의 수명주기를 TapGestureRecognizer올바르게 처리하고 있지 않습니다 . 더 이상 사용되지 않을 dispose()때 메서드 를 호출해야합니다 RichText. 여기를보십시오 : api.flutter.dev/flutter/painting/TextSpan/recognizer.html
Alex Semeniuk

@AlexSemeniuk 귀하의 예에서는 StatefulWidget을 사용하고 있으며 위의 답변에서는 StatelessWidget입니다. StatelessWidget의 경우를 처리해야합니까?
Corey Cole

2
@CoreyCole StatelessWidget은 마술처럼 당신을 TapGestureRecognizer위해 당신을 처분하지 않습니다 . 실제로이 StatelessWidget시나리오에서 사용 하는 것은 잘못된 방법입니다. rsource를 이런 방식으로 처리 할 수 ​​없기 때문입니다. 그리고 네, 당신은 절대적으로 호출 할 필요 dispose()의 방법 TapGestureRecognizer이 중지해야하는 내부 타이머를 실행하기 때문에.
Alex Semeniuk 2010 년

50

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

"인앱 내비게이션 너머보기"가 무슨 뜻인지 잘 모르겠습니다. 링크를 통해 브라우저를 열겠습니까?
Collin Jackson

예, 클릭하여 찾아보기에서 열 수있는 링크 등입니다.
TaylorR

1
그것이 내가 링크 한 샘플이하는 일입니다. 나는 그것을 보여주기 위해 답변에 그림을 추가했습니다.
Collin Jackson

repo 링크가 끊어졌습니다
Michel Feinstein

41

당신은 당신의 포장 수 TextGestureDetector와 핸들을 클릭합니다 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

그런 다음 Button 위젯으로 둘러 쌉니다. :)
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으로 위에서 보여 파크 포맷, 당신의 텍스트의 나머지 부분과 같은 배경 및 텍스트 색상
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,
      ),
    ),
  );
}

Linux flutter pub get에서Unable to find a plugin.vcxproj for plugin "url_launcher_windows"
Eugene Gr. Philippov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.