मैं अपने फ़्लटर ऐप में प्रदर्शित करने के लिए हाइपरलिंक बनाना चाहूंगा।
हाइपर लिंक को एक Text
या समान पाठ दृश्य में एम्बेड किया जाना चाहिए जैसे:
The last book bought is <a href='#'>this</a>
ऐसा करने के लिए कोई संकेत?
जवाबों:
बस एक पाठ विजेट के चारों ओर एक इंकवेल लपेटें और ऑनटैप विशेषता के लिए एक UrlLuncher (सेवा पुस्तकालय से) की आपूर्ति करें। नीचे उपयोग करने से पहले एक Flutter पैकेज के रूप में UrlLauncher स्थापित करें ।
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')
),
),
),
);
}
}
आप इसे लिंक की तरह दिखने के लिए टेक्स्ट विजेट को एक शैली प्रदान कर सकते हैं।
इस मुद्दे को थोड़ा देखने के बाद मैंने आपके लिए 'हाइपरलिंक्स' को लागू करने के लिए एक अलग समाधान ढूंढ लिया। आप रिच टेक्स्ट विजेट का उपयोग संलग्न टेक्स्टस्पैन के साथ कर सकते हैं ।
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');
},
),
],
),
),
),
),
);
}
}
इस तरह से आप वास्तव में एक शब्द को उजागर कर सकते हैं और उसमें से हाइपरलिंक बना सकते हैं;)
TapGestureRecognizer
सही ढंग से नहीं संभाल रहे हैं । dispose()
जब आपको RichText
अब उपयोग नहीं करना है, तो आपको कॉल विधि करनी होगी । यहां देखें: api.flutter.dev/flutter/painting/TextSpan/recognizer.html
StatelessWidget
आपके TapGestureRecognizer
लिए जादुई रूप से आपका निपटान नहीं करेगा । वास्तव में, StatelessWidget
इस परिदृश्य का उपयोग करना गलत है, क्योंकि आप इस तरह से अपने सूत्रों का निपटान नहीं कर सकते हैं। और हां, आपको पूरी तरह से कॉल dispose()
करने की आवश्यकता है TapGestureRecognizer
, क्योंकि यह आंतरिक टाइमर चलाता है जिसे रोकने की आवश्यकता है।
स्पंदन में अंतर्निहित हाइपरलिंक समर्थन नहीं है लेकिन आप इसे स्वयं नकली कर सकते हैं। गैलरी के drawer.dart में एक उदाहरण है । वे RichText
एक रंग युक्त विजेट का उपयोग करते हैं TextSpan
, जिसमें recognizer
नल को संभालने की विशेषता होती है:
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,
),
],
),
InkWell
इसके बजाय उपयोग कर सकते हैं GestureDetector
।
आप पैकेज 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';
}
}
}
आपके ऐप में क्लिक करने योग्य लिंक डालने का एक वैकल्पिक (या नहीं) तरीका (मेरे लिए यह सिर्फ उसी तरह काम करता है):
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
तो यह whith bartektartanus रूप TextDecoration.underline ऊपर से पता चला प्रारूप ... अपने ग्रंथों के बाकी के रूप में एक ही पृष्ठभूमि और पाठ रंग के साथ,
आप लिंक टेक्स्ट 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,
),
),
);
}
flutter pub get
लिए इसके साथ विफलUnable to find a plugin.vcxproj for plugin "url_launcher_windows"