From 1fd0bfe2c37724291230a73dc07f0825b5ede863 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Fri, 7 Jul 2023 11:22:17 -0400 Subject: [PATCH 1/2] [url_lancher] Don't use `canLaunchUrl` in Link The pattern of calling `canLaunchUrl` when there's no fallback is an anti-pattern, and the README explicitly recommends against it; on some platforms, `canLaunchUrl` is unreliable in some cases, and/or requires extra permissions that `launchUrl` does not. This reworks the launch call to just try, and handle failure, instead of trying to pre-check. --- packages/url_launcher/url_launcher/CHANGELOG.md | 3 ++- packages/url_launcher/url_launcher/lib/src/link.dart | 10 +++++++--- packages/url_launcher/url_launcher/pubspec.yaml | 2 +- packages/url_launcher/url_launcher/test/link_test.dart | 8 ++++++-- 4 files changed, 16 insertions(+), 7 deletions(-) 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/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); }); From 3e9e090fc9ba94d208bb3aa06ea0564ee4fcbcd9 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Fri, 7 Jul 2023 11:36:31 -0400 Subject: [PATCH 2/2] Remove stray whitespace --- packages/url_launcher/url_launcher/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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