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

Background Platform Channels for desktop #93945

Open
gaaclarke opened this issue Nov 20, 2021 · 13 comments
Open

Background Platform Channels for desktop #93945

gaaclarke opened this issue Nov 20, 2021 · 13 comments
Labels
a: desktop Running on desktop c: new feature Nothing broken; request for a new capability P3 Issues that are less important to the Flutter project platform-linux Building on or for Linux specifically platform-mac Building on or for macOS specifically platform-windows Building on or for Windows specifically team-macos Owned by the macOS platform team triaged-macos Triaged by the macOS platform team

Comments

@gaaclarke
Copy link
Member

gaaclarke commented Nov 20, 2021

Background Platform Channels (a way for Platform Channels to execute their host platform handlers on a background thread instead of forcing them to use the platform thread) are implemented for iOS and Android. This issue represents the work to implement them on the desktop platforms (and embedder.h).

Related Issue: #91635

@gaaclarke gaaclarke added the a: desktop Running on desktop label Nov 20, 2021
@gspencergoog gspencergoog added P3 Issues that are less important to the Flutter project c: new feature Nothing broken; request for a new capability platform-windows Building on or for Windows specifically platform-linux Building on or for Linux specifically platform-mac Building on or for macOS specifically labels Dec 2, 2021
@niuhuan
Copy link

niuhuan commented Jan 12, 2022

I think it is necessary to execute method channel in other threads, because a long time will block the UI.
Call database or other network operation can take a lot of time, I usually create a thread pool, this is almost inevitable, and every platform has done this.

@niuhuan
Copy link

niuhuan commented Feb 9, 2022

Result unique pointer can't move to another thread , I think it not about windows (platform) . I tried any way, can't move it, may flutter to give result time life delete at method call over? sqflite not support windows / Linux too.

@stuartmorgan
Copy link
Contributor

Result unique pointer can't move to another thread

You can pass the results pointer between threads as much as you want, you just need to return to original thread before calling it.

@niuhuan
Copy link

niuhuan commented Feb 9, 2022

How can i post a task or result callback to original thread? ( like kotlin " Handler(Looper.getMainLooper()).post {} " , or like ios/mac Thread { result() }).

I only want async result, this does not block the UI.

@stuartmorgan
Copy link
Contributor

How can i post a task or result callback to original thread?

See comments in #79213 for some pointers. If you need more help beyond that, try a resource like StackOverflow.

@gaaclarke
Copy link
Member Author

I drew up a sequence diagram that shows how this might work here.

One interesting thing about implementing this is that the platform message handler is something that is modular. You can specify it when you setup the embedder. Changing the thread that runs on would be a breaking change.

@stuartmorgan
Copy link
Contributor

Generally we handle things like this by adding another field to FlutterProjectArgs. In this case either a bool to enable background channels, or an alternate callback param that can be set instead of the original one that is documented to be called on any channel (and then we would internally use whichever is set).

@alexmercerind
Copy link

alexmercerind commented Aug 24, 2022

How can i post a task or result callback to original thread? ( like kotlin " Handler(Looper.getMainLooper()).post {} " , or like ios/mac Thread { result() }).

I only want async result, this does not block the UI.

@niuhuan, not the best approach but still better alternative than hacking around in native code (for now):

  • You should launch a separate thread in detached mode when making a call from Dart to C/C++ for heavy computation.
  • Instead of sending the final result/reply through the method channel (success/error), invoke new method on the same channel from C/C++ to Dart & send the final data as argument.
  • Receive it on Dart side using Completer.
  • UI won't freeze.

Downside:

Note that your code written like this may differ from existing platform channel implementations (for other platforms) & may require refactor in future when this feature lands on engine.

@stuartmorgan
Copy link
Contributor

  • Instead of sending the final result/reply through the method channel (success/error), invoke new method on the same channel from C/C++ to Dart & send the final data as argument.

These use the same mechanism and have the same threading requirements, and replies can already be asynchronous, so this won't make a difference.

This has no relation to the threading on the native side.

@alexmercerind
Copy link

alexmercerind commented Aug 24, 2022

These use the same mechanism and have the same threading requirements, and replies can already be asynchronous, so this won't make a difference.

Apologies if I'm missing something, but sending a reply from another thread on Linux seems to raise some failed assertions.

[ +149 ms] ** (libmpv_tagger_example:206236): CRITICAL **: 00:49:36.602: FlBinaryMessengerResponseHandle was not responded to
[   +3 ms] ** (libmpv_tagger_example:206236): CRITICAL **: 00:49:36.606: gboolean fl_method_call_respond(FlMethodCall *, FlMethodResponse *, GError **): assertion 'FL_IS_METHOD_CALL(self)'

This has no relation to the threading on the native side.

I just wanted him to know how to wait for the response (since await channel.invokeMethod would no longer work), if I didn't know 😅.

Thanks!

@stuartmorgan
Copy link
Contributor

Apologies if I'm missing something, but sending a reply from another thread on Linux seems to raise some failed assertions.

Sending replies and calling new methods are both main-thread-only on all desktop platforms at the moment.

If you are currently calling any channel methods on another thread, your code has undefined behavior.

@gaaclarke gaaclarke reopened this Mar 7, 2023
atsansone pushed a commit to flutter/website that referenced this issue Apr 26, 2023
This updates the guidelines about threading and the responses to
platform channels. Once the following PRs are on `main` all official
platforms (minus web where it doesn't make sense) support thread-safe
responses.

issue: flutter/flutter#93945

Do no land until the following are on stable:
1) flutter/engine#37689
1) flutter/engine#37607
1) flutter/engine#36909

## Presubmit checklist
- [x] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [x] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [x] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>
Co-authored-by: Parker Lougheed <parlough@gmail.com>
atsansone pushed a commit to flutter/website that referenced this issue Apr 26, 2023
This updates the guidelines about threading and the responses to
platform channels. Once the following PRs are on `main` all official
platforms (minus web where it doesn't make sense) support thread-safe
responses.

issue: flutter/flutter#93945

Do no land until the following are on stable:
1) flutter/engine#37689
1) flutter/engine#37607
1) flutter/engine#36909

## Presubmit checklist
- [x] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [x] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [x] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>
Co-authored-by: Parker Lougheed <parlough@gmail.com>
khanhnwin added a commit to flutter/website that referenced this issue May 10, 2023
* Adding state restoration pages (#8424)

Fixes #2004
Fixes another issue that I can't find atm.

[Staged
link](https://sz-flutter-2.web.app/development/platform-integration/android/restore-state-android)

@goderbauer, there are questions for you in this PR.

cc @goderbauer

---------

Co-authored-by: Parker Lougheed <parlough@gmail.com>

* Fix typo "priori" -> "prior" (#8573)

_Description of what this PR is changing or adding, and why:_

_Issues fixed by this PR (if any): Fix typo in
`src/resources/inside-flutter.md:589`

- [x] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [x] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [x] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/master/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

---------

Co-authored-by: Brett Morgan <brettmorgan@google.com>
Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>

* Replace Webby mention with I/O in banner (#8627)

The Webby voting has ended. This PR removes the Webby mention and
reintroduces the I/O call to action.

<img width="559" alt="Screenshot of banner"
src="https://user-images.githubusercontent.com/18372958/234385170-785d7be7-9b39-4752-b398-95a7e7f987a7.png">

Co-authored-by: Brett Morgan <brettmorgan@google.com>

* [Proposal] Breakup development directory (#8624)

This pull request extracts all subcategories from `/development` to
top-level entries, to match similar entries like "Deployment" and
"Testing and debugging". The subcategories under Development are perhaps
the most important categories for learning Flutter, but they were hidden
under Development. This made them harder to navigate, with smaller text,
and with deeper links and breadcrumbs.

Work done:
- Pulled subdirectories out of `/development`
- Updated all old redirects and links to new destination
- Introduce new redirects so old links keep working
- Add some of the new top-level dividers to visually distinguish content
- Enable breadcrumbs in moved content
- Enable breadcrumbs within "Deployment"
- Moved "Add to app" below "Deployment"
- Add a short title for Add to app

This is part of incremental work, and will be followed up with breaking
up and reorganization "User interface", adjusting titles of content, and
adding some cookbooks to the sidenav.

Staged:
https://flutter-docs-prod--pr8624-feature-breakup-deve-00ees3e9.web.app/

* Deprecate `describeEnum`. (#8571)

Tied to flutter/flutter#125016

---------

Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>

* Moving migration guides to the release directory (#8629)

Part of the IA cleanup, moving migration guides to the /release
directory and removing them from the sidenav.

cc @parlough

---------

Co-authored-by: Parker Lougheed <parlough@gmail.com>

* flavors.md - Updated path of "New Scheme" in the XCode menu. (#8599)

Updated path of "New Scheme" in the XCode menu.

![image](https://user-images.githubusercontent.com/4278331/233380485-da5efb42-5ea7-47e1-883e-6a949299332a.png)

**IMPORTANT:** Due to work on the docs.flutter.dev infrastructure, **all
open pull requests will be closed April 26.**

If your PR needs to be merged by April 26, please say that in your PR.

Otherwise, please [file an
issue](https://github.com/flutter/website/issues/new/choose) about the
needed change, and (if you submit a PR) be prepared to recreate the PR
May 10 or later.

---

_Description of what this PR is changing or adding, and why:_

_Issues fixed by this PR (if any):_

- [ ] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [ ] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [ ] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

* Bump site-shared from `04a5353` to `74292e2` (#8630)

* Fix apostrophe in contextual-survey-metadata.json (#8631)

Changing apostrophe character in description

---

Makes it so that we can parse the json in dart code in the response

* Document the new `canvasKitVariant` runtime configuration (#8475)

Add documentation for the new
[`canvasKitVariant`](https://github.com/flutter/engine/blob/0776f38b87137ad2535d77e91a79b8b6c80f16fb/lib/web_ui/lib/src/engine/configuration.dart#L221-L224)
runtime configuration.

Closes flutter/flutter#123048

- [x] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [x] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [x] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/master/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

---------

Co-authored-by: Anthony Sansone <atsansone@users.noreply.github.com>

* Adding wireless debugging information to the docs (#8456)

We've added support for wireless debugging of iOS devices. This PR adds
documentation for setting it up.

To do:
- [x] Add in information about IPv4 and IPv6  to `flutter attach` page
- [ ] Specify the Flutter release where this feature is available
- [x] See if there's any information needed for Android wireless
debugging

_Issues fixed by this PR (if any):_
#8425

- [x] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [x] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [x] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/master/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

---------

Co-authored-by: Victoria Ashworth <vashworth@google.com>
Co-authored-by: Brett Morgan <brettmorgan@google.com>
Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>

* Adaptation information for inputs and app bars (#8509)

This PR adds some information on how to adapt styling for input widgets
with .adaptive() constructors, as well as top app bars.

Note that I am not sure of the best way to style the tables or size the
images. Also, I have added some commented out sections that should be
added when stable release goes live.

Fixes: #8428

- [X] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [X] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [X] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/master/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

@MitchellGoodwin could you take a quick peak at the code and make sure
it looks okay?

@InMatrix feel free to propose any edits!

---------

Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>

* Adapting bottom navigation bar (#8541)

This adds to our platform adaptation documentation to add a section on
tab bars.

This fixes this issue: https://github.com/flutter/website/issues/8540.

Builds on top of this PR: #8509

- [X] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [X] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [X] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/master/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

---------

Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>
Co-authored-by: Anthony Sansone <atsansone@users.noreply.github.com>

* Updated Impeller details (#8607)

Fixes #8608

---------

Co-authored-by: Loïc Sharma <737941+loic-sharma@users.noreply.github.com>

* Enable build checks and tests in next branch (#8609)

* Update widget catalog to show Material 3 widgets (#8574)

Fixes #8432.

Site changes are viewable at the staging site:
https://flutter-site-73ed1.web.app/development/ui/widgets/.

Primary changes:
- Addition of Material 3 Components card
[(view)](https://flutter-site-73ed1.web.app/development/ui/widgets/).
- New Material 3 page showing M3 widgets as displayed in matching
categories to material.io/components. This also includes a note about
Material 3 becoming the default - this text is not final and can be
iterated on in review.
- Widget cards in the M3 page have a hover effect applied.
- In the widgets overview page, Material now links to M3, and contains a
link to the previous M2 widgets page.

General notes:
- Material 2 page ~~remains unchanged~~ has a notice about Material 3.
- No light/dark modes - this was explored but decided against, with the
possibility of returning to it if the site undergoes a site-wide dark
mode addition.

- [x] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [x] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [x] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/master/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

* Updated the threading notice for platform channel responses. (#7901)

This updates the guidelines about threading and the responses to
platform channels. Once the following PRs are on `main` all official
platforms (minus web where it doesn't make sense) support thread-safe
responses.

issue: flutter/flutter#93945

Do no land until the following are on stable:
1) flutter/engine#37689
1) flutter/engine#37607
1) flutter/engine#36909

- [x] This PR doesn’t contain automatically generated corrections
(Grammarly or similar).
- [x] This PR follows the [Google Developer Documentation Style
Guidelines](https://developers.google.com/style) — for example, it
doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person).
- [x] This PR uses [semantic line
breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks)
of 80 characters or fewer.

Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>
Co-authored-by: Parker Lougheed <parlough@gmail.com>

* Update PR Template for Website Freeze (#8632)

---------

Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com>
Co-authored-by: Parker Lougheed <parlough@gmail.com>
Co-authored-by: 失魂魚 <satwanjyu@outlook.com>
Co-authored-by: Brett Morgan <brettmorgan@google.com>
Co-authored-by: Bernardo Ferrari <bernaferrari2@gmail.com>
Co-authored-by: Dimitris Paxinos <dpaxinos@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Elias Yishak <42216813+eliasyishak@users.noreply.github.com>
Co-authored-by: Mouad Debbar <mouad.debbar@gmail.com>
Co-authored-by: Anthony Sansone <atsansone@users.noreply.github.com>
Co-authored-by: Leigha Jarett <leighaj@google.com>
Co-authored-by: Victoria Ashworth <vashworth@google.com>
Co-authored-by: Loïc Sharma <737941+loic-sharma@users.noreply.github.com>
Co-authored-by: Eilidh Southren <esouthren@google.com>
Co-authored-by: gaaclarke <30870216+gaaclarke@users.noreply.github.com>
andreaszapf added a commit to andreaszapf/just_audio_windows that referenced this issue Dec 29, 2023
Fix for the following warning when AudioPlayer functions like
setAudioSource are called:

[ERROR:flutter/shell/common/shell.cc(1015)]
The 'com.ryanheise.just_audio.events....' channel sent a message from
native to Flutter on a non-platform thread. Platform channel messages
must be sent on the platform thread. Failure to do so may result in
data loss or crashes, and must be fixed in the plugin or application
code creating that channel...

WIP:

- At some point Flutter will support sending messages from any thread.
  Tracking issue: flutter/flutter#93945
  So this is mostly a stopgap solution.

- Alternatively to the enable_shared_from_this pattern, posted
  messages could capture weak pointers to the event sink. This would
  behave subtly differently when the sink pointer changes between
  posting the message and executing the handler (i.e., upon any
  change, the handler would see an empty pointer. This is possibly
  more correct).
andreaszapf added a commit to andreaszapf/just_audio_windows that referenced this issue Dec 29, 2023
Fix for the following warning when AudioPlayer functions like
setAudioSource are called:

[ERROR:flutter/shell/common/shell.cc(1015)]
The 'com.ryanheise.just_audio.events....' channel sent a message from
native to Flutter on a non-platform thread. Platform channel messages
must be sent on the platform thread. Failure to do so may result in
data loss or crashes, and must be fixed in the plugin or application
code creating that channel...

WIP:

- At some point Flutter will support sending messages from any thread.
  Tracking issue: flutter/flutter#93945
  So this is mostly a stopgap solution.

- Alternatively to the enable_shared_from_this pattern, posted
  messages could capture weak pointers to the event sink. This would
  behave subtly differently when the sink pointer changes between
  posting the message and executing the handler (i.e., upon any
  change, the handler would see an empty pointer. This is possibly
  more correct).
andreaszapf added a commit to andreaszapf/just_audio_windows that referenced this issue Jan 14, 2024
Fix for the following warning when AudioPlayer functions like
setAudioSource are called:

[ERROR:flutter/shell/common/shell.cc(1015)]
The 'com.ryanheise.just_audio.events....' channel sent a message from
native to Flutter on a non-platform thread. Platform channel messages
must be sent on the platform thread. Failure to do so may result in
data loss or crashes, and must be fixed in the plugin or application
code creating that channel...

WIP:

- At some point Flutter will support sending messages from any thread.
  Tracking issue: flutter/flutter#93945
  So this is mostly a stopgap solution.

- Alternatively to the enable_shared_from_this pattern, posted
  messages could capture weak pointers to the event sink. This would
  behave subtly differently when the sink pointer changes between
  posting the message and executing the handler (i.e., upon any
  change, the handler would see an empty pointer. This is possibly
  more correct).
@jwang0512

This comment was marked as off-topic.

@cbracken cbracken added team-macos Owned by the macOS platform team and removed team-desktop labels Jun 5, 2024
@flutter-triage-bot
Copy link

The triaged-desktop label is irrelevant if there is no team-desktop label or fyi-desktop label.

@jmagman jmagman added the triaged-macos Triaged by the macOS platform team label Jun 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
a: desktop Running on desktop c: new feature Nothing broken; request for a new capability P3 Issues that are less important to the Flutter project platform-linux Building on or for Linux specifically platform-mac Building on or for macOS specifically platform-windows Building on or for Windows specifically team-macos Owned by the macOS platform team triaged-macos Triaged by the macOS platform team
Projects
None yet
Development

No branches or pull requests

10 participants