diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md index 7360ed63002..f13fb66fce0 100644 --- a/packages/url_launcher/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 6.1.12 +* Removes the use of `canLaunchUrl` in `Link`, to avoid issues on platforms where `canLaunchUrl` is unreliable or requires permissions. * Updates minimum supported macOS version to 10.14. * Fixes stale ignore: prefer_const_constructors. * Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. diff --git a/packages/url_launcher/url_launcher/README.md b/packages/url_launcher/url_launcher/README.md index 47196eb07a5..10c3db3f019 100644 --- a/packages/url_launcher/url_launcher/README.md +++ b/packages/url_launcher/url_launcher/README.md @@ -17,7 +17,7 @@ To use this plugin, add `url_launcher` as a [dependency in your pubspec.yaml fil ### Example -``` dart +```dart import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -72,7 +72,7 @@ element must be added to your manifest as a child of the root element. Example: -``` xml +```xml diff --git a/packages/url_launcher/url_launcher/lib/src/link.dart b/packages/url_launcher/url_launcher/lib/src/link.dart index 4e8f72d07cf..cea6845b12e 100644 --- a/packages/url_launcher/url_launcher/lib/src/link.dart +++ b/packages/url_launcher/url_launcher/lib/src/link.dart @@ -121,14 +121,18 @@ class DefaultLinkDelegate extends StatelessWidget { // At this point, we know that the link is external. So we use the // `launchUrl` API to open the link. - if (await canLaunchUrl(url)) { - await launchUrl( + bool success; + try { + success = await launchUrl( url, mode: _useWebView ? LaunchMode.inAppWebView : LaunchMode.externalApplication, ); - } else { + } on PlatformException { + success = false; + } + if (!success) { FlutterError.reportError(FlutterErrorDetails( exception: 'Could not launch link $url', stack: StackTrace.current, diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index 6cf68a7210a..78d9723ddd7 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL. Supports web, phone, SMS, and email schemes. repository: https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+url_launcher%22 -version: 6.1.11 +version: 6.1.12 environment: sdk: ">=3.0.0 <4.0.0" diff --git a/packages/url_launcher/url_launcher/test/link_test.dart b/packages/url_launcher/url_launcher/test/link_test.dart index 1c3d3e1e2d5..1585420d9b2 100644 --- a/packages/url_launcher/url_launcher/test/link_test.dart +++ b/packages/url_launcher/url_launcher/test/link_test.dart @@ -64,7 +64,9 @@ void main() { ) ..setResponse(true); await followLink!(); - expect(mock.canLaunchCalled, isTrue); + // Calling canLaunch just to pre-check launch is an anti-pattern, since + // canLaunch doesn't always work, so ensure that it's not called. + expect(mock.canLaunchCalled, isFalse); expect(mock.launchCalled, isTrue); }); @@ -93,7 +95,9 @@ void main() { ) ..setResponse(true); await followLink!(); - expect(mock.canLaunchCalled, isTrue); + // Calling canLaunch just to pre-check launch is an anti-pattern, since + // canLaunch doesn't always work, so ensure that it's not called. + expect(mock.canLaunchCalled, isFalse); expect(mock.launchCalled, isTrue); });