Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[webview_flutter_android] Updates Dart and Java InstanceManagers #3282

Merged
merged 30 commits into from
Mar 17, 2023

Conversation

bparrishMines
Copy link
Contributor

@bparrishMines bparrishMines commented Feb 23, 2023

These changes fix a potential bug caused by a hot restart that would fail to call FlutterApi.create for a static native Object.

Updates to Java InstanceManager:

  • Added the clear method. This method was added to be able to clear the InstanceManager in the event of a hot restart.
  • Since the InstanceManager can now be cleared on a hot restart, it now requires that instances added with addHostCreatedInstance to be unique. And identifiers used in addDartCreatedInstance must be unique.

Updates to Dart InstanceManager:

  • The initial call to JavaObject.globalInstanceManager makes a pigeon call to clear the native InstanceManager.
  • Adds the @immutable annotation to Copyable.

This also raises the pigeon version

Pre-launch Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I read the Tree Hygiene wiki page, which explains my responsibilities.
  • I read and followed the relevant style guides and ran the auto-formatter. (Unlike the flutter/flutter repo, the flutter/packages repo does use dart format.)
  • I signed the CLA.
  • The title of the PR starts with the name of the package surrounded by square brackets, e.g. [shared_preferences]
  • I listed at least one issue that this PR fixes in the description above.
  • I updated pubspec.yaml with an appropriate new version according to the pub versioning philosophy, or this PR is exempt from version changes.
  • I updated CHANGELOG.md to add a description of the change, following repository CHANGELOG style.
  • I updated/added relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or this PR is test-exempt.
  • All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@bparrishMines bparrishMines changed the title Instance manager copy [webview_flutter_android] Updates Dart and Java InstanceManagers Feb 28, 2023
Copy link
Contributor

@stuartmorgan stuartmorgan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM with one suggestion

@@ -38,12 +35,22 @@ class JavaObject with Copyable {
instanceManager: instanceManager,
);

static InstanceManager? _globalInstanceManager;
Copy link
Contributor

@stuartmorgan stuartmorgan Mar 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The less error-prone way of doing lazy initialization is:

static InstanceManager globalInstanceManager = _initInstanceManager();

static final InstanceManager _initInstanceManager() {
  WidgetsFlutterBinding.ensureInitialized();
  // Clears the native `InstanceManager` on initial use of the Dart one.
  InstanceManagerHostApi().clear();
  return InstanceManager(
    onWeakReferenceRemoved: (int identifier) {
      JavaObjectHostApiImpl().dispose(identifier);
    },
  );
}

(For non-statics, you can do the same thing but with late final to make it lazy.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc @camsim99 FYI when updating the InstanceManager.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated example

/// Global instance of [InstanceManager].
static final InstanceManager globalInstanceManager = _initInstanceManager();

static InstanceManager _initInstanceManager() {
  WidgetsFlutterBinding.ensureInitialized();
  // Clears the native `InstanceManager` on initial use of the Dart one.
  InstanceManagerHostApi().clear();
  return InstanceManager(
    onWeakReferenceRemoved: (int identifier) {
      JavaObjectHostApiImpl().dispose(identifier);
     },
  );
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, I'll fix my copy to avoid confusion. Sorry about that.

@bparrishMines bparrishMines added the autosubmit Merge PR when tree becomes green via auto submit App label Mar 17, 2023
@auto-submit auto-submit bot merged commit 43a42d1 into flutter:main Mar 17, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Mar 17, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Mar 17, 2023
@bparrishMines bparrishMines deleted the instance_manager_copy branch March 17, 2023 19:26
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Mar 20, 2023
tarrinneal pushed a commit to flutter/flutter that referenced this pull request Mar 20, 2023
* 7636eb7 [go_router_builder] Support default value for `Set`, `List` and `Iterable` route parameters (flutter/packages#3391)

* 26c95da [image_picker] Move HashSet construction within if-statement (flutter/packages#3448)

* f5687b2 [image_picker] fix typos in comments (flutter/packages#3413)

* 84afba7 [image_picker] Migrate Android to Pigeon (flutter/packages#3476)

* 42927fc [image_picker]: Bump androidx.exifinterface:exifinterface from 1.3.3 to 1.3.6 in /packages/image_picker/image_picker_android/android (flutter/packages#3238)

* 9a44bdf Require Dart SDK 2.14, because of using APIs. (flutter/packages#3468)

* 12609a2 [ci] Clean up iOS simulators (flutter/packages#3458)

* 9b136a9 [ci/tool] Add external dependency validation (flutter/packages#3466)

* 11aab47 Manual roll Flutter from fb7e828 to 67e5f66 (8 revisions) (flutter/packages#3482)

* 784291b Update goldens (flutter/packages#3442)

* 43a42d1 [webview_flutter_android] Updates Dart and Java InstanceManagers (flutter/packages#3282)

* d0de136 [camera] Reland android flip/change camera while recording (flutter/packages#3460)

* 74fd094 [image_picker_android] Adjust file extension in FileUtils when it does not match its mime type (flutter/packages#3409)

* d2f1d2d [flutter_adaptive_scaffold] : 🐛 [FIX] : Issue: 121135. (flutter/packages#3253)

* 3d078b5 Roll Flutter from 67e5f66 to 53dfd23 (39 revisions) (flutter/packages#3484)

* 3b3a09d [url_launcher] Convert iOS to Pigeon (flutter/packages#3481)

* 80cd50a Roll Flutter from 53dfd23 to 6bd2b3c (17 revisions) (flutter/packages#3486)

* 998bb29 [webview_flutter] Updates the README with the migration of `WebView.initialCookies` and Hybrid Composition on (flutter/packages#3470)

* bbf86a7 Roll Flutter from 6bd2b3c to 3e4e092 (7 revisions) (flutter/packages#3490)
nploi pushed a commit to nploi/packages that referenced this pull request Jul 16, 2023
…tter#3282)

[webview_flutter_android] Updates Dart and Java InstanceManagers
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
autosubmit Merge PR when tree becomes green via auto submit App p: webview_flutter platform-android
Projects
None yet
2 participants