Fix ContentPage memory leak on Android when using NavigationPage modally (fixes #33918)#34117
Merged
jfversluis merged 5 commits intodotnet:inflight/currentfrom Feb 24, 2026
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
Fixes an Android memory leak when modal navigation involves NavigationPage (including inside TabbedPage) by ensuring StackNavigationManager releases references on disconnect, and re-enables/adds regression coverage in device memory tests.
Changes:
- Clear retained references (
_currentPage, fragment container/manager, navigation stack) inStackNavigationManager.Disconnect()to allow GC after modal dismissal. - Re-enable
PagesDoNotLeak(NavigationPage)on Android in memory device tests. - Add an Android device test asserting
StackNavigationManagerclears retained references after popping a modal tabbed flow; remove a duplicateRemoveFromInnerChildrencall inNavigationPagepop logic.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| src/Core/src/Platform/Android/Navigation/StackNavigationManager.cs | Clears internal fields/stack on Disconnect() to break reference chains and prevent page retention. |
| src/Controls/tests/DeviceTests/Memory/MemoryTests.cs | Re-enables NavigationPage coverage in PagesDoNotLeak on Android. |
| src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Android.cs | Adds Android regression test validating references are cleared after modal tabbed navigation is popped. |
| src/Controls/src/Core/NavigationPage/NavigationPage.cs | Removes a duplicated RemoveFromInnerChildren(currentPage) during pop navigation. |
src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Android.cs
Show resolved
Hide resolved
src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Android.cs
Outdated
Show resolved
Hide resolved
src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Android.cs
Outdated
Show resolved
Hide resolved
…ionPageTests.Android.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
pictos
reviewed
Feb 18, 2026
|
|
||
| await baseNavPage.Navigation.PopModalAsync(animated: false); | ||
|
|
||
| var flags = BindingFlags.NonPublic | BindingFlags.Instance; |
Contributor
There was a problem hiding this comment.
instead of using reflection, why not write a test on MemoryTests and validate that GC will collect the NavigationPage?
Contributor
Author
There was a problem hiding this comment.
That didn't work. Using reflection is a pattern used by other tests as well.
jfversluis
approved these changes
Feb 24, 2026
github-actions bot
pushed a commit
that referenced
this pull request
Feb 24, 2026
…lly (fixes #33918) (#34117) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change On Android, navigating modally with a `NavigationPage` (including as children of a `TabbedPage`) caused a memory leak. After the modal was dismissed, `StackNavigationManager` held onto three references that prevented the pages from being garbage collected: - `_currentPage` — the last active page - `_fragmentContainerView` — the Android fragment container - `_fragmentManager` — the Android fragment manager These were never cleared in `Disconnect()`, so even after the modal stack was fully dismissed and the handler was disconnected, the managed objects remained reachable. ### `NavigationPage.cs` — Fix Removed a duplicate `RemoveFromInnerChildren(currentPage)` call that was invoked twice in succession during pop navigation. This seemed to be accidentally added in June 2025 by commit 850f52d, and was flagged by Copilot in #27888 but it appears no action was taken on that. Ultimately, this line ended up duplicated for unknown reasons. ### `MemoryTests.cs` — Re-enable `NavigationPage` leak test on Android `PagesDoNotLeak` excluded `NavigationPage` on Android under `#if !ANDROID` (referencing issue #27411) because `NavigationPage` leaked there. The exclusion has been removed, as the test passes. ### `NavigationPageTests.Android.cs` — New device test Added `StackNavigationManagerClearsReferencesOnDisconnect`, which: 1. Pushes a `TabbedPage` with two `NavigationPage` children modally 2. Switches tabs to ensure both `NavigationPage` handlers are activated 3. Pops the modal ## Testing - [x] `StackNavigationManagerClearsReferencesOnDisconnect` — new device test; fails without fix, passes with fix (verified on Pixel 8a, Android 15) - [x] `PagesDoNotLeak(NavigationPage)` — re-enabled on Android; passes with fix - [x] `PushingAndPoppingDoesntFireBackButtonVisibleToolbarEvents` — existing test; still passes ### Issues Fixed Fixes #33918 --------- Co-authored-by: Brian Runck <brunck@intermatic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
jfversluis
pushed a commit
that referenced
this pull request
Mar 2, 2026
…lly (fixes #33918) (#34117) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change On Android, navigating modally with a `NavigationPage` (including as children of a `TabbedPage`) caused a memory leak. After the modal was dismissed, `StackNavigationManager` held onto three references that prevented the pages from being garbage collected: - `_currentPage` — the last active page - `_fragmentContainerView` — the Android fragment container - `_fragmentManager` — the Android fragment manager These were never cleared in `Disconnect()`, so even after the modal stack was fully dismissed and the handler was disconnected, the managed objects remained reachable. ### `NavigationPage.cs` — Fix Removed a duplicate `RemoveFromInnerChildren(currentPage)` call that was invoked twice in succession during pop navigation. This seemed to be accidentally added in June 2025 by commit 850f52d, and was flagged by Copilot in #27888 but it appears no action was taken on that. Ultimately, this line ended up duplicated for unknown reasons. ### `MemoryTests.cs` — Re-enable `NavigationPage` leak test on Android `PagesDoNotLeak` excluded `NavigationPage` on Android under `#if !ANDROID` (referencing issue #27411) because `NavigationPage` leaked there. The exclusion has been removed, as the test passes. ### `NavigationPageTests.Android.cs` — New device test Added `StackNavigationManagerClearsReferencesOnDisconnect`, which: 1. Pushes a `TabbedPage` with two `NavigationPage` children modally 2. Switches tabs to ensure both `NavigationPage` handlers are activated 3. Pops the modal ## Testing - [x] `StackNavigationManagerClearsReferencesOnDisconnect` — new device test; fails without fix, passes with fix (verified on Pixel 8a, Android 15) - [x] `PagesDoNotLeak(NavigationPage)` — re-enabled on Android; passes with fix - [x] `PushingAndPoppingDoesntFireBackButtonVisibleToolbarEvents` — existing test; still passes ### Issues Fixed Fixes #33918 --------- Co-authored-by: Brian Runck <brunck@intermatic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
jfversluis
pushed a commit
that referenced
this pull request
Mar 2, 2026
…lly (fixes #33918) (#34117) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change On Android, navigating modally with a `NavigationPage` (including as children of a `TabbedPage`) caused a memory leak. After the modal was dismissed, `StackNavigationManager` held onto three references that prevented the pages from being garbage collected: - `_currentPage` — the last active page - `_fragmentContainerView` — the Android fragment container - `_fragmentManager` — the Android fragment manager These were never cleared in `Disconnect()`, so even after the modal stack was fully dismissed and the handler was disconnected, the managed objects remained reachable. ### `NavigationPage.cs` — Fix Removed a duplicate `RemoveFromInnerChildren(currentPage)` call that was invoked twice in succession during pop navigation. This seemed to be accidentally added in June 2025 by commit 850f52d, and was flagged by Copilot in #27888 but it appears no action was taken on that. Ultimately, this line ended up duplicated for unknown reasons. ### `MemoryTests.cs` — Re-enable `NavigationPage` leak test on Android `PagesDoNotLeak` excluded `NavigationPage` on Android under `#if !ANDROID` (referencing issue #27411) because `NavigationPage` leaked there. The exclusion has been removed, as the test passes. ### `NavigationPageTests.Android.cs` — New device test Added `StackNavigationManagerClearsReferencesOnDisconnect`, which: 1. Pushes a `TabbedPage` with two `NavigationPage` children modally 2. Switches tabs to ensure both `NavigationPage` handlers are activated 3. Pops the modal ## Testing - [x] `StackNavigationManagerClearsReferencesOnDisconnect` — new device test; fails without fix, passes with fix (verified on Pixel 8a, Android 15) - [x] `PagesDoNotLeak(NavigationPage)` — re-enabled on Android; passes with fix - [x] `PushingAndPoppingDoesntFireBackButtonVisibleToolbarEvents` — existing test; still passes ### Issues Fixed Fixes #33918 --------- Co-authored-by: Brian Runck <brunck@intermatic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
github-actions bot
pushed a commit
that referenced
this pull request
Mar 3, 2026
…lly (fixes #33918) (#34117) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change On Android, navigating modally with a `NavigationPage` (including as children of a `TabbedPage`) caused a memory leak. After the modal was dismissed, `StackNavigationManager` held onto three references that prevented the pages from being garbage collected: - `_currentPage` — the last active page - `_fragmentContainerView` — the Android fragment container - `_fragmentManager` — the Android fragment manager These were never cleared in `Disconnect()`, so even after the modal stack was fully dismissed and the handler was disconnected, the managed objects remained reachable. ### `NavigationPage.cs` — Fix Removed a duplicate `RemoveFromInnerChildren(currentPage)` call that was invoked twice in succession during pop navigation. This seemed to be accidentally added in June 2025 by commit 850f52d, and was flagged by Copilot in #27888 but it appears no action was taken on that. Ultimately, this line ended up duplicated for unknown reasons. ### `MemoryTests.cs` — Re-enable `NavigationPage` leak test on Android `PagesDoNotLeak` excluded `NavigationPage` on Android under `#if !ANDROID` (referencing issue #27411) because `NavigationPage` leaked there. The exclusion has been removed, as the test passes. ### `NavigationPageTests.Android.cs` — New device test Added `StackNavigationManagerClearsReferencesOnDisconnect`, which: 1. Pushes a `TabbedPage` with two `NavigationPage` children modally 2. Switches tabs to ensure both `NavigationPage` handlers are activated 3. Pops the modal ## Testing - [x] `StackNavigationManagerClearsReferencesOnDisconnect` — new device test; fails without fix, passes with fix (verified on Pixel 8a, Android 15) - [x] `PagesDoNotLeak(NavigationPage)` — re-enabled on Android; passes with fix - [x] `PushingAndPoppingDoesntFireBackButtonVisibleToolbarEvents` — existing test; still passes ### Issues Fixed Fixes #33918 --------- Co-authored-by: Brian Runck <brunck@intermatic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
HarishKumarSF4517
pushed a commit
to HarishKumarSF4517/maui
that referenced
this pull request
Mar 5, 2026
…lly (fixes dotnet#33918) (dotnet#34117) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change On Android, navigating modally with a `NavigationPage` (including as children of a `TabbedPage`) caused a memory leak. After the modal was dismissed, `StackNavigationManager` held onto three references that prevented the pages from being garbage collected: - `_currentPage` — the last active page - `_fragmentContainerView` — the Android fragment container - `_fragmentManager` — the Android fragment manager These were never cleared in `Disconnect()`, so even after the modal stack was fully dismissed and the handler was disconnected, the managed objects remained reachable. ### `NavigationPage.cs` — Fix Removed a duplicate `RemoveFromInnerChildren(currentPage)` call that was invoked twice in succession during pop navigation. This seemed to be accidentally added in June 2025 by commit 850f52d, and was flagged by Copilot in dotnet#27888 but it appears no action was taken on that. Ultimately, this line ended up duplicated for unknown reasons. ### `MemoryTests.cs` — Re-enable `NavigationPage` leak test on Android `PagesDoNotLeak` excluded `NavigationPage` on Android under `#if !ANDROID` (referencing issue dotnet#27411) because `NavigationPage` leaked there. The exclusion has been removed, as the test passes. ### `NavigationPageTests.Android.cs` — New device test Added `StackNavigationManagerClearsReferencesOnDisconnect`, which: 1. Pushes a `TabbedPage` with two `NavigationPage` children modally 2. Switches tabs to ensure both `NavigationPage` handlers are activated 3. Pops the modal ## Testing - [x] `StackNavigationManagerClearsReferencesOnDisconnect` — new device test; fails without fix, passes with fix (verified on Pixel 8a, Android 15) - [x] `PagesDoNotLeak(NavigationPage)` — re-enabled on Android; passes with fix - [x] `PushingAndPoppingDoesntFireBackButtonVisibleToolbarEvents` — existing test; still passes ### Issues Fixed Fixes dotnet#33918 --------- Co-authored-by: Brian Runck <brunck@intermatic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
github-actions bot
pushed a commit
that referenced
this pull request
Mar 6, 2026
…lly (fixes #33918) (#34117) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change On Android, navigating modally with a `NavigationPage` (including as children of a `TabbedPage`) caused a memory leak. After the modal was dismissed, `StackNavigationManager` held onto three references that prevented the pages from being garbage collected: - `_currentPage` — the last active page - `_fragmentContainerView` — the Android fragment container - `_fragmentManager` — the Android fragment manager These were never cleared in `Disconnect()`, so even after the modal stack was fully dismissed and the handler was disconnected, the managed objects remained reachable. ### `NavigationPage.cs` — Fix Removed a duplicate `RemoveFromInnerChildren(currentPage)` call that was invoked twice in succession during pop navigation. This seemed to be accidentally added in June 2025 by commit 850f52d, and was flagged by Copilot in #27888 but it appears no action was taken on that. Ultimately, this line ended up duplicated for unknown reasons. ### `MemoryTests.cs` — Re-enable `NavigationPage` leak test on Android `PagesDoNotLeak` excluded `NavigationPage` on Android under `#if !ANDROID` (referencing issue #27411) because `NavigationPage` leaked there. The exclusion has been removed, as the test passes. ### `NavigationPageTests.Android.cs` — New device test Added `StackNavigationManagerClearsReferencesOnDisconnect`, which: 1. Pushes a `TabbedPage` with two `NavigationPage` children modally 2. Switches tabs to ensure both `NavigationPage` handlers are activated 3. Pops the modal ## Testing - [x] `StackNavigationManagerClearsReferencesOnDisconnect` — new device test; fails without fix, passes with fix (verified on Pixel 8a, Android 15) - [x] `PagesDoNotLeak(NavigationPage)` — re-enabled on Android; passes with fix - [x] `PushingAndPoppingDoesntFireBackButtonVisibleToolbarEvents` — existing test; still passes ### Issues Fixed Fixes #33918 --------- Co-authored-by: Brian Runck <brunck@intermatic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
PureWeen
added a commit
that referenced
this pull request
Mar 11, 2026
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 46 commits with various improvements, bug fixes, and enhancements. ## Button - [Android] Implemented material3 support for Button by @Dhivya-SF4094 in #33173 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Button](#33172) </details> ## CollectionView - [Android] Fix RemainingItemsThresholdReachedCommand not firing when CollectionView has Header and Footer both defined by @SuthiYuvaraj in #29618 <details> <summary>🔧 Fixes</summary> - [Android : RemainingItemsThresholdReachedCommand not firing when CollectionVew has Header and Footer both defined](#29588) </details> - [iOS/MacCatalyst] Fix CollectionView ScrollTo for horizontal layouts by @Shalini-Ashokan in #33853 <details> <summary>🔧 Fixes</summary> - [[iOS/MacCatalyst] CollectionView ScrollTo does not work with horizontal Layout](#33852) </details> - [iOS & Mac] Fixed IndicatorView Size doesnt update dynamically by @SubhikshaSf4851 in #31129 <details> <summary>🔧 Fixes</summary> - [[iOS, Catalyst] IndicatorView.IndicatorSize does not update dynamically at runtime](#31064) </details> - [Android] Fix for CollectionView Scrolled event is triggered on the initial app load. by @BagavathiPerumal in #33558 <details> <summary>🔧 Fixes</summary> - [[Android] CollectionView Scrolled event is triggered on the initial app load.](#33333) </details> - [iOS, Android] Fix for CollectionView IsEnabled=false allows touch interactions by @praveenkumarkarunanithi in #31403 <details> <summary>🔧 Fixes</summary> - [More issues with CollectionView IsEnabled, InputTransparent, Opacity via Styles and code behind](#19771) </details> - [iOS] Fix VerticalOffset Update When Modifying CollectionView.ItemsSource While Scrolled by @devanathan-vaithiyanathan in #34153 <details> <summary>🔧 Fixes</summary> - [[iOS]VerticalOffset Not Reset to Zero After Clearing ItemSource in CollectionView](#26798) </details> ## DateTimePicker - [Android] Fix DatePicker MinimumDate/MaximumDate not updating dynamically by @HarishwaranVijayakumar in #33687 <details> <summary>🔧 Fixes</summary> - [[regression/8.0.3] [Android] DatePicker control minimum date issue](#19256) - [[Android] DatePicker does not update MinimumDate / MaximumDate in the Popup when set in the viewmodel after first opening](#33583) </details> ## Drawing - Android drawable perf by @albyrock87 in #31567 ## Editor - [Android] Implemented material3 support for Editor by @SyedAbdulAzeemSF4852 in #33478 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for Editor](#33476) </details> ## Entry - [iOS, Mac] Fix for CursorPosition not updating when typing into Entry control by @SyedAbdulAzeemSF4852 in #30505 <details> <summary>🔧 Fixes</summary> - [Entry control CursorPosition does not update on TextChanged event [iOS Maui 8.0.7] ](#20911) - [CursorPosition not calculated correctly on behaviors events for iOS devices](#32483) </details> ## Flyoutpage - [Android, Windows] Fix for FlyoutPage toolbar button not updating on orientation change by @praveenkumarkarunanithi in #31962 <details> <summary>🔧 Fixes</summary> - [Flyout page in Android does not show flyout button (burger) consistently](#24468) </details> - Fix for First Item in CollectionView Overlaps in FlyoutPage.Flyout on iOS by @praveenkumarkarunanithi in #29265 <details> <summary>🔧 Fixes</summary> - [[iOS] CollectionView not rendering first item correctly in FlyoutPage.Flyout](#29170) </details> ## Image - [Android] Fix excessive memory usage for stream and resource-based image loading by @Shalini-Ashokan in #33590 <details> <summary>🔧 Fixes</summary> - [[Android] Unexpected high Bitmap.ByteCount when loading image via ImageSource.FromResource() or ImageSource.FromStream() in .NET MAUI](#33239) </details> - [Android] Fix for Resize method returns an image that has already been disposed by @SyedAbdulAzeemSF4852 in #29964 <details> <summary>🔧 Fixes</summary> - [In GraphicsView, the Resize method returns an image that has already been disposed](#29961) - [IIMage.Resize bugged behaviour](#31103) </details> ## Label - Fixed Label Span font property inheritance when applied via Style by @SubhikshaSf4851 in #34110 <details> <summary>🔧 Fixes</summary> - [`Span` does not inherit text styling from `Label` if that styling is applied using `Style` ](#21326) </details> - [Android] Implemented material3 support for Label by @SyedAbdulAzeemSF4852 in #33599 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for Label](#33598) </details> ## Map - [Android] Fix Circle Stroke color is incorrectly updated as Fill color. by @NirmalKumarYuvaraj in #33643 <details> <summary>🔧 Fixes</summary> - [[Android] Circle Stroke color is incorrectly updated as Fill color.](#33642) </details> ## Mediapicker - [iOS] Fix: invoke MediaPicker completion handler after DismissViewController by @yuriikyry4enko in #34250 <details> <summary>🔧 Fixes</summary> - [[iOS] Media Picker UIImagePickerController closing issue](#21996) </details> ## Navigation - Fix ContentPage memory leak on Android when using NavigationPage modally (fixes #33918) by @brunck in #34117 <details> <summary>🔧 Fixes</summary> - [[Android] Modal TabbedPage whose tabs are NavigationPage(ContentPage) is retained after PopModalAsync()](#33918) </details> ## Picker - [Android] Implement material3 support for TimePicker by @HarishwaranVijayakumar in #33646 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for TimePicker](#33645) </details> - [Android] Implemented Material3 support for Picker by @SyedAbdulAzeemSF4852 in #33668 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Picker](#33665) </details> ## RadioButton - [Android] Implemented material3 support for RadioButton by @SyedAbdulAzeemSF4852 in #33468 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for RadioButton](#33467) </details> ## Setup - Clarify MA003 error message by @jeremy-visionaid in #34067 <details> <summary>🔧 Fixes</summary> - [MA003 false positive with 9.0.21](#26599) </details> ## Shell - [Android] Fix TabBar FlowDirection not updating dynamically by @SubhikshaSf4851 in #33091 <details> <summary>🔧 Fixes</summary> - [[Android, iOS] FlowDirection RTL is not updated dynamically on Shell TabBar](#32993) </details> - [Android] Fix page not disposed on Shell replace navigation by @Vignesh-SF3580 in #33426 <details> <summary>🔧 Fixes</summary> - [[Android] [Shell] replace navigation leaks current page](#25134) </details> - [Android] Fixed Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled by @NanthiniMahalingam in #32734 <details> <summary>🔧 Fixes</summary> - [[Android] Shell.FlyoutVerticalScrollMode="Disabled" does not disable scrolling](#32477) </details> ## Single Project - Fix: Throw a clear error when an SVG lacks dimensions instead of a NullReferenceException by @Shalini-Ashokan in #33194 <details> <summary>🔧 Fixes</summary> - [MAUI Fails To Convert Valid SVG Files Into PNG Files (Object reference not set to an instance of an object)](#32460) </details> ## SwipeView - [iOS] Fix SwipeView stays open on iOS after updating content by @devanathan-vaithiyanathan in #31248 <details> <summary>🔧 Fixes</summary> - [[iOS] - Swipeview with collectionview issue](#19541) </details> ## TabbedPage - [Windows] Fixed IsEnabled Property not works on Tabs by @NirmalKumarYuvaraj in #26728 <details> <summary>🔧 Fixes</summary> - [ShellContent IsEnabledProperty does not work](#5161) - [[Windows] Shell Tab IsEnabled Not Working](#32996) </details> - [Android] Fix NavigationBar overlapping StatusBar when NavigationBar visibility changes by @Vignesh-SF3580 in #33359 <details> <summary>🔧 Fixes</summary> - [[Android] NavigationBar overlaps with StatusBar when mixing HasNavigationBar=true/false in TabbedPage on Android 15 (API 35)](#33340) </details> ## Templates - Fix for unable to open task using keyboard navigation on windows platform by @SuthiYuvaraj in #33647 <details> <summary>🔧 Fixes</summary> - [Unable to open task using keyboard: A11y_.NET maui_User can get all the insights of Dashboard_Keyboard](#30787) </details> ## TitleView - Fix for NavigationPage.TitleView does not expand with host window in iPadOS 26+ by @SuthiYuvaraj in #33088 ## Toolbar - [iOS] Fix toolbar items ignoring BarTextColor on iOS/MacCatalyst 26+ by @Shalini-Ashokan in #34036 <details> <summary>🔧 Fixes</summary> - [[iOS 26] ToolbarItem color with custom BarTextColor not working](#33970) </details> - [Android] Fix for ToolbarItem retaining the icon from the previous page on Android when using NavigationPage. by @BagavathiPerumal in #32311 <details> <summary>🔧 Fixes</summary> - [Toolbaritem keeps the icon of the previous page on Android, using NavigationPage (not shell)](#31727) </details> ## WebView - [Android] Fix WebView in a grid expands beyond it's cell by @devanathan-vaithiyanathan in #32145 <details> <summary>🔧 Fixes</summary> - [Android - WebView in a grid expands beyond it's cell](#32030) </details> ## Xaml - ContentPresenter: Propagate binding context to children with explicit TemplateBinding by @HarishwaranVijayakumar in #30880 <details> <summary>🔧 Fixes</summary> - [Binding context in ContentPresenter](#23797) </details> <details> <summary>🔧 Infrastructure (1)</summary> - [Revert] ContentPresenter: Propagate binding context to children with explicit TemplateBinding by @Ahamed-Ali in #34332 </details> <details> <summary>🧪 Testing (6)</summary> - [Testing] Feature Matrix UITest Cases for Shell Flyout Page by @NafeelaNazhir in #32525 - [Testing] Feature Matrix UITest Cases for Brushes by @LogishaSelvarajSF4525 in #31833 - [Testing] Feature Matrix UITest Cases for BindableLayout by @LogishaSelvarajSF4525 in #33108 - [Android] Add UI tests for Material 3 CheckBox by @HarishwaranVijayakumar in #34126 <details> <summary>🔧 Fixes</summary> - [[Android] Add UI tests for Material 3 CheckBox](#34125) </details> - [Testing] Feature Matrix UITest Cases for Shell Tabbed Page by @NafeelaNazhir in #33159 - [Testing] Fixed Test case failure in PR 34294 - [03/2/2026] Candidate - 1 by @TamilarasanSF4853 in #34334 </details> <details> <summary>📦 Other (2)</summary> - Bumps Syncfusion.Maui.Toolkit dependency to version 1.0.9 by @PaulAndersonS in #34178 - Fix crash when closing Windows based app when using TitleBar by @MFinkBK in #34032 <details> <summary>🔧 Fixes</summary> - [Unhandled exception "Value does not fall within the expected range" when closing Windows app](#32194) </details> </details> **Full Changelog**: main...inflight/candidate
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Description of Change
On Android, navigating modally with a
NavigationPage(including as children of aTabbedPage) caused a memory leak. After the modal was dismissed,StackNavigationManagerheld onto three references that prevented the pages from being garbage collected:_currentPage— the last active page_fragmentContainerView— the Android fragment container_fragmentManager— the Android fragment managerThese were never cleared in
Disconnect(), so even after the modal stack was fully dismissed and the handler was disconnected, the managed objects remained reachable.NavigationPage.cs— FixRemoved a duplicate
RemoveFromInnerChildren(currentPage)call that was invoked twice in succession during pop navigation.This seemed to be accidentally added in June 2025 by commit 850f52d, and was flagged by Copilot in #27888 but it appears no action was taken on that. Ultimately, this line ended up duplicated for unknown reasons.
MemoryTests.cs— Re-enableNavigationPageleak test on AndroidPagesDoNotLeakexcludedNavigationPageon Android under#if !ANDROID(referencing issue #27411) becauseNavigationPageleaked there. The exclusion has been removed, as the test passes.NavigationPageTests.Android.cs— New device testAdded
StackNavigationManagerClearsReferencesOnDisconnect, which:TabbedPagewith twoNavigationPagechildren modallyNavigationPagehandlers are activatedTesting
StackNavigationManagerClearsReferencesOnDisconnect— new device test; fails without fix, passes with fix (verified on Pixel 8a, Android 15)PagesDoNotLeak(NavigationPage)— re-enabled on Android; passes with fixPushingAndPoppingDoesntFireBackButtonVisibleToolbarEvents— existing test; still passesIssues Fixed
Fixes #33918