From 89a3ad4c1cfeddaad88e06bfcd596268afcbb8bf Mon Sep 17 00:00:00 2001 From: Kristoffer Vinther Date: Mon, 16 May 2022 18:14:19 +0200 Subject: [PATCH 1/4] [url_launcher_web] Added stress test of creation and disposing of Link widgets. --- .../integration_test/link_widget_test.dart | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/url_launcher/url_launcher_web/example/integration_test/link_widget_test.dart b/packages/url_launcher/url_launcher_web/example/integration_test/link_widget_test.dart index 3b75e0556686..6b19861c5ce5 100644 --- a/packages/url_launcher/url_launcher_web/example/integration_test/link_widget_test.dart +++ b/packages/url_launcher/url_launcher_web/example/integration_test/link_widget_test.dart @@ -123,6 +123,36 @@ void main() { final html.Element anchor = _findSingleAnchor(); expect(anchor.hasAttribute('href'), false); }); + + testWidgets('can be created and disposed', (WidgetTester tester) async { + final Uri uri = Uri.parse('http://foobar'); + const int itemCount = 500; + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: MediaQuery( + data: const MediaQueryData(), + child: ListView.builder( + itemCount: itemCount, + itemBuilder: (_, int index) => WebLinkDelegate(TestLinkInfo( + uri: uri, + target: LinkTarget.defaultTarget, + builder: (BuildContext context, FollowLink? followLink) => + Text('#$index', textAlign: TextAlign.center), + )), + ), + ), + ), + ); + + await tester.pumpAndSettle(); + + await tester.scrollUntilVisible( + find.text('#${itemCount - 1}'), + 2500, + maxScrolls: 1000, + ); + }); }); } From 5f5509a86b23eb46189cd1976874df0834f6a70c Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 13 Jun 2022 17:51:13 -0700 Subject: [PATCH 2/4] [url_launcher_web] Do not call onPlatformViewCreated if controller has been disposed. --- packages/url_launcher/url_launcher_web/lib/src/link.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/url_launcher/url_launcher_web/lib/src/link.dart b/packages/url_launcher/url_launcher_web/lib/src/link.dart index eccd9aef80e3..28d8485ef392 100644 --- a/packages/url_launcher/url_launcher_web/lib/src/link.dart +++ b/packages/url_launcher/url_launcher_web/lib/src/link.dart @@ -118,7 +118,13 @@ class LinkViewController extends PlatformViewController { final int viewId = params.id; final LinkViewController controller = LinkViewController(viewId, context); controller._initialize().then((_) { - params.onPlatformViewCreated(viewId); + /// Because _initialize is async, it can happen that [LinkViewController.dispose] + /// may get called before this `then` callback. + /// Check that the `controller` that was created by this factory is not + /// disposed before calling `onPlatformViewCreated`. + if (_instances[viewId] == controller) { + params.onPlatformViewCreated(viewId); + } }); return controller; } From 4f1412d0042596a9eb154c9a9e7174d0925843e5 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 13 Jun 2022 17:54:41 -0700 Subject: [PATCH 3/4] Remove unused context from LinkViewController. --- .../url_launcher/url_launcher_web/lib/src/link.dart | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/url_launcher/url_launcher_web/lib/src/link.dart b/packages/url_launcher/url_launcher_web/lib/src/link.dart index 28d8485ef392..112d07ea7571 100644 --- a/packages/url_launcher/url_launcher_web/lib/src/link.dart +++ b/packages/url_launcher/url_launcher_web/lib/src/link.dart @@ -76,7 +76,7 @@ class WebLinkDelegateState extends State { child: PlatformViewLink( viewType: linkViewType, onCreatePlatformView: (PlatformViewCreationParams params) { - _controller = LinkViewController.fromParams(params, context); + _controller = LinkViewController.fromParams(params); return _controller ..setUri(widget.link.uri) ..setTarget(widget.link.target); @@ -100,7 +100,7 @@ class WebLinkDelegateState extends State { /// Controls link views. class LinkViewController extends PlatformViewController { /// Creates a [LinkViewController] instance with the unique [viewId]. - LinkViewController(this.viewId, this.context) { + LinkViewController(this.viewId) { if (_instances.isEmpty) { // This is the first controller being created, attach the global click // listener. @@ -113,10 +113,9 @@ class LinkViewController extends PlatformViewController { /// platform view [params]. factory LinkViewController.fromParams( PlatformViewCreationParams params, - BuildContext context, ) { final int viewId = params.id; - final LinkViewController controller = LinkViewController(viewId, context); + final LinkViewController controller = LinkViewController(viewId); controller._initialize().then((_) { /// Because _initialize is async, it can happen that [LinkViewController.dispose] /// may get called before this `then` callback. @@ -165,9 +164,6 @@ class LinkViewController extends PlatformViewController { @override final int viewId; - /// The context of the [Link] widget that created this controller. - final BuildContext context; - late html.Element _element; bool get _isInitialized => _element != null; @@ -214,7 +210,7 @@ class LinkViewController extends PlatformViewController { // browser handle it. event.preventDefault(); final String routeName = _uri.toString(); - pushRouteNameToFramework(context, routeName); + pushRouteNameToFramework(null, routeName); } Uri? _uri; From 14b4953b88e9dcbf3b4d3466cd0cb67adcf09733 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 13 Jun 2022 18:01:32 -0700 Subject: [PATCH 4/4] Update CHANGELOG and pubspec.yaml --- packages/url_launcher/url_launcher_web/CHANGELOG.md | 6 ++++++ packages/url_launcher/url_launcher_web/pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/url_launcher/url_launcher_web/CHANGELOG.md b/packages/url_launcher/url_launcher_web/CHANGELOG.md index 068650be6d53..75c0819cefdc 100644 --- a/packages/url_launcher/url_launcher_web/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_web/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.0.12 + +* Fixes call to `setState` after dispose on the `Link` widget. +[Issue](https://github.com/flutter/flutter/issues/102741). +* Removes unused `BuildContext` from the `LinkViewController`. + ## 2.0.11 * Minor fixes for new analysis options. diff --git a/packages/url_launcher/url_launcher_web/pubspec.yaml b/packages/url_launcher/url_launcher_web/pubspec.yaml index cef323035379..d0e0fa905d57 100644 --- a/packages/url_launcher/url_launcher_web/pubspec.yaml +++ b/packages/url_launcher/url_launcher_web/pubspec.yaml @@ -2,7 +2,7 @@ name: url_launcher_web description: Web platform implementation of url_launcher repository: https://github.com/flutter/plugins/tree/main/packages/url_launcher/url_launcher_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+url_launcher%22 -version: 2.0.11 +version: 2.0.12 environment: sdk: ">=2.12.0 <3.0.0"