Raise minimum versions to Flutter 3.38 / Dart 3.10 for native assets - #1170
Merged
Conversation
hiroshihorie
marked this pull request as ready for review
August 11, 2026 09:05
hiroshihorie
requested review from
cloudwebrtc and
xianshijing-lk
as code owners
August 11, 2026 09:05
xianshijing-lk
approved these changes
Aug 11, 2026
xianshijing-lk
left a comment
Contributor
There was a problem hiding this comment.
Thanks for fixing it. lgtm assuming there is no functionality change
This was referenced Aug 11, 2026
hiroshihorie
added a commit
that referenced
this pull request
Aug 11, 2026
…1172) _onDataChannel registered a nested listener: every state change on a subscriber data channel attached a new listener to the publisher reliable channel and emitted SubscriberDataChannelStateUpdatedEvent from that channel's state instead. So subscriber state changes produced no immediate event, the events that did arrive carried the publisher channel's state (for the lossy label too), and inner listeners accumulated uncancelled for the lifetime of the connection. Now each subscriber channel emits its own state directly from a single listener, mirroring the publisher-side wiring. Also initializes the late stateChangeStream field in MockDataChannel, which previously threw LateInitializationError whenever engine code touched it in tests. Regression test verified to fail against the old wiring. Pre-existing bug surfaced by Devin on the #1170 reformat diff, fixed separately to keep that PR mechanical.
# Conflicts: # lib/src/core/engine.dart # lib/src/e2ee/key_provider.dart
Merged
hiroshihorie
added a commit
that referenced
this pull request
Sep 7, 2026
Minor release. Main theme is iOS audio robustness: the audio session is resolved from engine state before any policy is pushed (fixes audio engine error -9001 in pre-connect / pre-join / playout-only flows) and microphone permission is requested before capture starts. Also raises the floor to Flutter 3.38 / Dart 3.10 for native assets. ## Changes Added - `AudioSessionException` for iOS audio session failures Changed - Microphone permission and audio session failures throw `TrackCreateException` / `AudioSessionException` instead of `AudioProcessingException` - Minimum Flutter 3.38 / Dart 3.10; json_annotation 4.12 / json_serializable 6.14 regen Fixed - iOS: audio session configured from engine state before a policy is pushed (-9001) - iOS/macOS: microphone permission requested before capture starts - Android: failed local recording pre-warm no longer aborts capture - Linux: use-after-free in `TaskRunnerLinux::EnqueueTask` - Subscriber data channel state events report the right channel and no longer leak listeners - `sendText` declares the UTF-8 byte length in the stream header - `BaseKeyProvider.create` honors `discardFrameWhenCryptorNotReady` - `CachingTokenSource.fetch` awaits its result - Pre-connect audio buffer is reusable after a failed recording start ## Review notes Diff reviewed against `v2.11.0`. Analyze, format, import order, version check, and 407 tests pass. Version fields, changelog, and consumed changesets are consistent. The #1170 reformat is behavior-neutral. No blockers; follow-ups to consider: - iOS permission gate rejects `applicationState == .inactive` (visible Split View, pre-`didBecomeActive` launch); `!= .background` would avoid the false positive. - Default recording preset now applies whenever nothing was pushed in automatic mode; apps that own `AVAudioSession` and start the engine before Dart syncs need manual mode. Worth a changelog note. - Android pre-warm catch also swallows failures from applying processing options. - `on AudioProcessingException` catch sites no longer see permission / session failures; changeset is `patch`.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Raises the minimum supported versions to Flutter 3.38 / Dart 3.10, the floor for stable native assets (build hooks). This is the delivery mechanism for the upcoming Rust core (#1160), split out so that PR can stay focused on the uniffi work itself.
Native assets were experimental from Dart 3.2 and became stable exactly in Flutter 3.38 / Dart 3.10 (November 2025). Note for later stages of the Rust work: link hooks (
hook/link.darttree shaking) would additionally need Dart 3.13, plain build hooks do not.Changes
sdk >=3.10.0 <4.0.0,flutter >=3.38.0(was 3.6 / 3.27, which was already fictional, the de facto floor was 3.7 / 3.29 via device_info_plus)dart formatto the tall style (mechanical, 106 files).g.dartregenerated. The old<6.10.0pin existed only because newer codegen requires Dart 3.8, which the raised floor now providesuse_null_aware_elements,unnecessary_underscores)Verified locally: analyze, format, import sorter all clean, full test suite passes (396 tests).