Skip to content

Fixed Flyout Not Displayed on Android When FlyoutWidth Is Set Only for Desktop via OnIdiom#29028

Merged
kubaflo merged 5 commits into
dotnet:inflight/currentfrom
NanthiniMahalingam:fix-13243
Apr 18, 2026
Merged

Fixed Flyout Not Displayed on Android When FlyoutWidth Is Set Only for Desktop via OnIdiom#29028
kubaflo merged 5 commits into
dotnet:inflight/currentfrom
NanthiniMahalingam:fix-13243

Conversation

@NanthiniMahalingam
Copy link
Copy Markdown
Contributor

Issue Details

The Shell flyout is not displayed due to the absence of a specified FlyoutWidth value for the current idiom, and no default value is provided in the OnIdiom.

Root Cause

The FlyoutWidth property returns a value of 0 instead of its default value (-1) from the OnIdiom extension when FlyoutWidth is set only for the Desktop idiom and no default value is provided. As a result, the flyout is not displayed when the application is run on the Android platform.

Description of Changes

Retrieved the default value using the GetDefaultValue method from the bindable property and handled the target setter case in the OnIdiomExtension when the value is null due to the absence of a specified value for the current idiom.

Reference

https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74

Issues Fixed

Fixes #13243

Validated the behaviour in the following platforms

  • Android
  • Windows
  • iOS
  • Mac

Output

Android

Before After
Before_Android.mov
After_Android.mov

iOS

Before After
Before_iOS.mp4
After_iOS.mp4

@NanthiniMahalingam NanthiniMahalingam changed the title Fixed Fixed Flyout Not Displayed on Android When FlyoutWidth Is Set Only for Desktop via OnIdiom Apr 16, 2025
@dotnet-policy-service dotnet-policy-service Bot added community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration labels Apr 16, 2025
@NanthiniMahalingam NanthiniMahalingam marked this pull request as ready for review April 16, 2025 13:50
Copilot AI review requested due to automatic review settings April 16, 2025 13:50
@NanthiniMahalingam NanthiniMahalingam requested a review from a team as a code owner April 16, 2025 13:50
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR addresses the issue of the Shell flyout not displaying on Android when FlyoutWidth is specified only for Desktop by ensuring a proper default value is retrieved via the OnIdiomExtension. Key changes include:

  • Adding a test case in TestCases.Shared.Tests to verify the flyout displays correctly.
  • Creating corresponding host app UI pages in TestCases.HostApp.
  • Updating the OnIdiomExtension to retrieve the default value from the bindable property when no explicit value is provided.

Reviewed Changes

Copilot reviewed 3 out of 4 changed files in this pull request and generated no comments.

File Description
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue13243.cs Added a new automated UITest verifying the flyout behavior.
src/Controls/tests/TestCases.HostApp/Issues/Issue13243.xaml.cs Introduced new UI pages to support the test for the flyout issue.
src/Controls/src/Xaml/MarkupExtensions/OnIdiomExtension.cs Modified null handling to retrieve the default value from the bindable property.
Files not reviewed (1)
  • src/Controls/tests/TestCases.HostApp/Issues/Issue13243.xaml: Language not supported

@jsuarezruiz
Copy link
Copy Markdown
Contributor

/azp run MAUI-UITests-public

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

@kubaflo
Copy link
Copy Markdown
Contributor

kubaflo commented Mar 21, 2026

@StephaneDelcroix @simonrozsival Could you please review?

@MauiBot MauiBot added s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-approved AI agent recommends approval - PR fix is correct and optimal and removed s/agent-approved AI agent recommends approval - PR fix is correct and optimal s/agent-changes-requested AI agent recommends changes - found a better alternative or issues labels Mar 27, 2026
@MauiBot MauiBot added s/agent-changes-requested AI agent recommends changes - found a better alternative or issues and removed s/agent-approved AI agent recommends approval - PR fix is correct and optimal labels Apr 3, 2026
@dotnet dotnet deleted a comment from MauiBot Apr 12, 2026
@dotnet dotnet deleted a comment from MauiBot Apr 12, 2026
@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented Apr 12, 2026

🚦 Gate — Test Before and After Fix

👋 @NanthiniMahalingam — new gate results are available. Please review the latest session below.

🚦 Gate Sessionde80c65 · Removed unwanted comment · 2026-04-18 14:10 UTC

Gate Result: ✅ PASSED

Platform: ANDROID · Base: main · Merge base: eb0b82fe

Test Without Fix (expect FAIL) With Fix (expect PASS)
🖥️ Issue13243 Issue13243 ✅ FAIL — 793s ✅ PASS — 1305s
🔴 Without fix — 🖥️ Issue13243: FAIL ✅ · 793s
  Determining projects to restore...
  Restored /home/vsts/work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 6.33 sec).
  Restored /home/vsts/work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 6.26 sec).
  Restored /home/vsts/work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 168 ms).
  Restored /home/vsts/work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 8 ms).
  Restored /home/vsts/work/1/s/src/Essentials/src/Essentials.csproj (in 14 ms).
  Restored /home/vsts/work/1/s/src/Core/src/Core.csproj (in 48 ms).
  Restored /home/vsts/work/1/s/src/Core/maps/src/Maps.csproj (in 27 ms).
  Restored /home/vsts/work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 1.32 sec).
  Restored /home/vsts/work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 33 ms).
  Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 1.11 sec).
  1 of 11 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
  Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:08:39.77
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
  Determining projects to restore...
  Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 1.07 sec).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 851 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 8 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 1.43 sec).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 2.59 sec).
  Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 9.39 sec).
  Restored /home/vsts/work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 9 ms).
  Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.Android.Tests/Controls.TestCases.Android.Tests.csproj (in 3.2 sec).
  5 of 13 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.18]   Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.54]   Discovered:  Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
   NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 04/18/2026 13:48:01 FixtureSetup for Issue13243(Android)
>>>>> 04/18/2026 13:48:05 ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue Start
>>>>> 04/18/2026 13:48:24 ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue Stop
>>>>> 04/18/2026 13:48:24 Log types: logcat, bugreport, server
  Failed ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue [20 s]
  Error Message:
   System.TimeoutException : Timed out waiting for element...
  Stack Trace:
     at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
   at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
   at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
   at Microsoft.Maui.TestCases.Tests.Issues.Issue13243.ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue13243.cs:line 20
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)

NUnit Adapter 4.5.0.0: Test execution complete

Total tests: 1
     Failed: 1
Test Run Failed.
 Total time: 1.4385 Minutes

🟢 With fix — 🖥️ Issue13243: PASS ✅ · 1305s

(truncated to last 15,000 chars)

ostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.RunInstall() [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]

Build FAILED.

/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: Mono.AndroidTools.InstallFailedException: Unexpected install output: cmd: Failure calling service package: Broken pipe (32) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:  [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String output, String packageName) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Mono.AndroidTools.AndroidDevice.<>c__DisplayClass105_0.<InstallPackage>b__0(Task`1 t) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.RunInstall() [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
    0 Warning(s)
    1 Error(s)

Time Elapsed 00:10:48.69
* daemon not running; starting now at tcp:5037
* daemon started successfully
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:08:41.56
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.12]   Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.30]   Discovered:  Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
   NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 04/18/2026 14:10:04 FixtureSetup for Issue13243(Android)
>>>>> 04/18/2026 14:10:08 ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue Start
>>>>> 04/18/2026 14:10:11 ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue Stop
  Passed ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue [3 s]
NUnit Adapter 4.5.0.0: Test execution complete

Test Run Successful.
Total tests: 1
     Passed: 1
 Total time: 24.3115 Seconds

📁 Fix files reverted (1 files)
  • src/Controls/src/Xaml/MarkupExtensions/OnIdiomExtension.cs

@MauiBot MauiBot added s/agent-approved AI agent recommends approval - PR fix is correct and optimal and removed s/agent-changes-requested AI agent recommends changes - found a better alternative or issues labels Apr 12, 2026
@dotnet dotnet deleted a comment from MauiBot Apr 18, 2026
@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented Apr 18, 2026

🤖 AI Summary

👋 @NanthiniMahalingam — new AI review results are available. Please review the latest session below.

📊 Review Sessionde80c65 · Removed unwanted comment · 2026-04-18 14:49 UTC
🔍 Pre-Flight — Context & Validation

Issue: #13243 - [Android] FlyoutWidth with OnIdiom shows no flyout
PR: #29028 - Fixed Flyout Not Displayed on Android When FlyoutWidth Is Set Only for Desktop via OnIdiom
Platforms Affected: Android (primary), iOS, Windows, Mac
Files Changed: 1 implementation, 3 test

Key Findings

  • OnIdiomExtension.ProvideValue returned Activator.CreateInstance(typeof(double)) = 0.0 when no idiom matched, but Shell.FlyoutWidthProperty default is -1.0 (sentinel for auto-width). Setting it to 0.0 made the flyout invisible.
  • Fix mirrors the identical pattern already in OnPlatformExtension.cs (lines 115–120), calling bp.GetDefaultValue(targetObject as BindableObject) to return the correct registered default.
  • Returns null for Setter targets (same as OnPlatformExtension), which is correct — no override means "don't set".
  • Test uses Shell directly as a XAML file with FlyoutWidth="{OnIdiom Desktop=150}", then verifies flyout icon tap shows page content.

Code Review Summary

Verdict: NEEDS_DISCUSSION
Confidence: high
Errors: 0 | Warnings: 1 | Suggestions: 2

Key code review findings:

  • ⚠️ Failing CI check: maui-pr (Build .NET MAUI Build macOS (Release)) — appears to be an infra flake (other macOS build variants passed), but should be confirmed before merge.
  • 💡 Missing newline at end of Issue13243.xaml and Issue13243.cs test files.
  • 💡 No XAML unit test for the BindableProperty default-value path — UI test is the only coverage.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #29028 Call bp.GetDefaultValue(targetObject as BindableObject) when idiom doesn't match; return null for Setter targets ✅ PASSED (Gate) OnIdiomExtension.cs + 3 test files Mirrors OnPlatformExtension pattern

🔬 Code Review — Deep Analysis

Code Review — PR #29028

Independent Assessment

What this changes: OnIdiomExtension.ProvideValue expands the null-value branch (when no idiom-specific value is set and no Default is specified). Previously it returned Activator.CreateInstance(propertyType) (the zero-value) for any value-type property. The new code, when a BindableProperty is in play, branches on the target type: returns null for a Setter target; returns bp.GetDefaultValue(targetObject as BindableObject) otherwise. The old Activator.CreateInstance fallback is kept for non-BindableProperty value types.

Inferred motivation: A double BindableProperty like Shell.FlyoutWidthProperty has a non-zero default (-1.0, the sentinel for "auto-width"). When {OnIdiom Desktop=150} is used without a Default on Android (idiom is Phone or Tablet, not Desktop), GetValue() returns null. The old code set FlyoutWidth = 0.0, making the flyout invisible. The fix returns the property's actual registered default value (-1.0), restoring correct behavior.


Reconciliation with PR Narrative

Author claims: Retrieving the default value from the BindableProperty and handling the Setter target case when the value is null; references the same pattern in OnPlatformExtension.

Agreement: ✅ The root cause analysis is correct. Activator.CreateInstance(typeof(double)) = 0.0FlyoutWidthProperty.DefaultValue = -1.0. The fix exactly mirrors the pattern already established in OnPlatformExtension.cs (lines 115–120). The diff is functionally a port of that logic.


Findings

⚠️ Warning — Failing CI check: maui-pr (Build .NET MAUI Build macOS (Release))

gh pr checks 29028 shows maui-pr (Build .NET MAUI Build macOS (Release)) as fail while macOS Debug passed. The fix is pure C# with no platform-specific code, so this is likely an infra flake. The author should confirm it's not caused by the PR before merging.

The failing UI test jobs (Entry, WebView, CollectionView2, SafeAreaEdges, ScrollView, Cells/CheckBox) are in categories completely orthogonal to this change and appear to be pre-existing flakes unrelated to Shell/OnIdiom.

💡 Suggestion — Missing newline at end of two new test files

Both Issue13243.xaml and Issue13243.cs (test file) end with \ No newline at end of file. Minor inconsistency with the rest of the repo.

💡 Suggestion — No XAML unit test for the core BindableProperty default-value path

The behavioral change in OnIdiomExtension.cs is untested at the unit-test level. A test in src/Controls/tests/Xaml.UnitTests/Issues/ that mocks an idiom and asserts a double BindableProperty with a non-zero default returns the correct value (not 0.0) when the idiom doesn't match would provide a faster, more reliable regression guard.


Devil's Advocate

"Is bp.GetDefaultValue(targetObject as BindableObject) safe here?" Yes. TargetObject is the partially-inflated XAML object (e.g., the Shell instance), which is a BindableObject. FlyoutWidthProperty uses a static default (-1d), not a DefaultValueCreator, so there's no concern about calling a creator on a partially-constructed object. This exact pattern is already in production in OnPlatformExtension.

"Could this regress the existing Maui24500 test?" No. Maui24500.xaml uses {OnIdiom Default={Binding EditingMode}, Phone=False}GetValue() returns a non-null value for both Phone and Desktop idioms, so the new null-branch code is never entered.

"Does returning null for a Setter target break style sheets?" No — this matches OnPlatformExtension's established pattern. A Setter that resolves to null means "don't override", which is correct when no idiom matches.


Verdict: NEEDS_DISCUSSION

Confidence: high
Summary: The fix is correct, well-scoped, and directly mirrors the identical pattern in OnPlatformExtension. The code change itself is ready. The main open question is the failing maui-pr (Build .NET MAUI Build macOS (Release)) CI check — the author should verify it is a pre-existing infra flake before merge. A XAML unit test would provide a more durable regression guard than the UI test alone, but is not a blocker.


🔧 Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 try-fix (claude-opus-4.6) Use bindable.GetValue(bp) to read effective current value from target BindableObject ✅ PASS OnIdiomExtension.cs Goes through full value pipeline; handles styles/triggers
2 try-fix (claude-sonnet-4.6) s_notset sentinel pattern — init all properties to sentinel, replace GetValue() with TryGetValue(); mirrors OnPlatformExtension exactly ✅ PASS OnIdiomExtension.cs Most complete redesign; eliminates null-vs-notset ambiguity
3 try-fix (gpt-5.3-codex) Pre-compute fallbackValue = bp.GetDefaultValue(...) before calling GetValue(fallbackValue) which uses it via ?? chain ✅ PASS OnIdiomExtension.cs Fixes both null idiom and null Default simultaneously
4 try-fix (gpt-5.4) Use bp.DefaultValue static property (no method, no arg) as fallback — skips DefaultValueCreator ✅ PASS OnIdiomExtension.cs Simpler but ignores instance-specific DefaultValueCreator
PR PR #29028 Call bp.GetDefaultValue(targetObject as BindableObject) when idiom doesn't match; return null for Setter targets ✅ PASSED (Gate) OnIdiomExtension.cs + 3 test files Mirrors OnPlatformExtension pattern; handles DefaultValueCreator

Cross-Pollination

Model Round New Ideas? Details
claude-opus-4.6 2 No Solution space exhausted across all key dimensions

Exhausted: Yes

Selected Fix: PR #29028 fix — Reason: The PR's bp.GetDefaultValue(targetObject as BindableObject) is the strongest approach because it (1) exactly mirrors the proven OnPlatformExtension pattern in production, (2) handles both static DefaultValue and DefaultValueCreator delegates with instance context (unlike Attempt 4 which only uses bp.DefaultValue), (3) is the smallest diff (surgical change in null branch only), and (4) has already passed Gate testing. Attempts 1-4 all passed, but the PR's approach is the most semantically correct and maintainable.


📋 Report — Final Recommendation

✅ Final Recommendation: APPROVE

Phase Status

Phase Status Notes
Pre-Flight ✅ COMPLETE Issue #13243 context gathered; 1 impl file + 3 test files classified
Code Review NEEDS_DISCUSSION (high) 0 errors, 1 warning (CI flake), 2 suggestions
Gate ✅ PASSED Android — test fails without fix, passes with fix
Try-Fix ✅ COMPLETE 4 attempts, 4 passing
Report ✅ COMPLETE

Code Review Impact on Try-Fix

Code review found no ❌ Errors — no hard gates triggered. The one ⚠️ Warning (macOS Release CI flake) was advisory context only and did not constrain fix exploration. The failure-mode probe around Activator.CreateInstance(double) = 0.0 vs. the registered default of -1.0 directly confirmed the root cause hypothesis and guided all 4 try-fix models toward the correct fix location. All 4 models converged independently on the same structural fix (return the BindableProperty's registered default rather than 0.0), reinforcing confidence in the approach.

Summary

PR #29028 fixes a real bug in OnIdiomExtension.ProvideValue: when no idiom-specific value is set and no Default is provided, the old code returned Activator.CreateInstance(propertyType) — which is 0.0 for double — instead of the BindableProperty's registered default (-1.0 for FlyoutWidthProperty). The fix correctly calls bp.GetDefaultValue(targetObject as BindableObject), mirroring the identical pattern already in OnPlatformExtension. Gate testing confirmed the fix works on Android. Four independent try-fix models all passed with similar approaches, confirming the fix direction is sound. Code review verdict was NEEDS_DISCUSSION (not NEEDS_CHANGES) — no errors found.

Root Cause

Shell.FlyoutWidthProperty is registered with a default value of -1.0 (sentinel for "use platform auto-width"). When {OnIdiom Desktop=150} is used and the running platform is Android (idiom = Phone), GetValue() returns null (no Phone or Default is set). The old code path if (value == null && propertyType.IsValueType) return Activator.CreateInstance(propertyType) returned 0.0 for double, overwriting the -1.0 default and causing the flyout to render with zero width — making it invisible.

Fix Quality

The fix is correct, minimal, and well-aligned with codebase conventions. Specifically:

  • Correctness: Returns the property's registered default (-1.0) instead of a zero-initialized value type (0.0), resolving the invisible flyout.
  • Pattern consistency: Mirrors OnPlatformExtension.cs lines 115–120 exactly — this exact pattern is already in production.
  • Scope: Single file change in implementation; test files are well-structured (XAML + code-behind + NUnit test with Shell category).
  • Minor gaps: Missing newline at EOF in two test files (cosmetic); no XAML unit test for the core path (the UI test is sufficient for merge, but a unit test would add durable regression protection).
  • Try-Fix comparison: PR's fix (bp.GetDefaultValue(targetObject as BindableObject)) was selected as best — it handles both DefaultValue and DefaultValueCreator delegates (unlike Attempt 4's bp.DefaultValue), is more minimal than Attempt 2's full sentinel redesign, and is semantically cleaner than Attempt 3's parameter-passing approach.

@kubaflo kubaflo changed the base branch from main to inflight/current April 18, 2026 19:16
@kubaflo kubaflo merged commit caf9a16 into dotnet:inflight/current Apr 18, 2026
166 of 177 checks passed
@github-actions github-actions Bot added this to the .NET 10 SR7 milestone Apr 18, 2026
PureWeen pushed a commit that referenced this pull request Apr 22, 2026
…r Desktop via OnIdiom (#29028)

### Issue Details

The Shell flyout is not displayed due to the absence of a specified
FlyoutWidth value for the current idiom, and no default value is
provided in the OnIdiom.

### Root Cause
The FlyoutWidth property returns a value of 0 instead of its default
value (-1) from the OnIdiom extension when FlyoutWidth is set only for
the Desktop idiom and no default value is provided. As a result, the
flyout is not displayed when the application is run on the Android
platform.

### Description of Changes
Retrieved the default value using the GetDefaultValue method from the
bindable property and handled the target setter case in the
OnIdiomExtension when the value is null due to the absence of a
specified value for the current idiom.

### Reference


https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74

### Issues Fixed
Fixes #13243 

Validated the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac

### Output

Android

|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/b24347f6-8f56-4fa7-b8c1-d29778711b89"
>| <video
src="https://github.com/user-attachments/assets/6cc923eb-072c-468d-bf9b-c7dfc74c8a28"
>|


iOS

|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/dd861cc8-b80f-4af7-b581-cb50889b553d"
>| <video
src="https://github.com/user-attachments/assets/78966ebb-6f4e-4500-b414-5072c7305813">|
PureWeen pushed a commit that referenced this pull request Apr 28, 2026
…r Desktop via OnIdiom (#29028)

### Issue Details

The Shell flyout is not displayed due to the absence of a specified
FlyoutWidth value for the current idiom, and no default value is
provided in the OnIdiom.

### Root Cause
The FlyoutWidth property returns a value of 0 instead of its default
value (-1) from the OnIdiom extension when FlyoutWidth is set only for
the Desktop idiom and no default value is provided. As a result, the
flyout is not displayed when the application is run on the Android
platform.

### Description of Changes
Retrieved the default value using the GetDefaultValue method from the
bindable property and handled the target setter case in the
OnIdiomExtension when the value is null due to the absence of a
specified value for the current idiom.

### Reference


https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74

### Issues Fixed
Fixes #13243 

Validated the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac

### Output

Android

|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/b24347f6-8f56-4fa7-b8c1-d29778711b89"
>| <video
src="https://github.com/user-attachments/assets/6cc923eb-072c-468d-bf9b-c7dfc74c8a28"
>|


iOS

|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/dd861cc8-b80f-4af7-b581-cb50889b553d"
>| <video
src="https://github.com/user-attachments/assets/78966ebb-6f4e-4500-b414-5072c7305813">|
PureWeen pushed a commit that referenced this pull request Apr 29, 2026
…r Desktop via OnIdiom (#29028)

### Issue Details

The Shell flyout is not displayed due to the absence of a specified
FlyoutWidth value for the current idiom, and no default value is
provided in the OnIdiom.

### Root Cause
The FlyoutWidth property returns a value of 0 instead of its default
value (-1) from the OnIdiom extension when FlyoutWidth is set only for
the Desktop idiom and no default value is provided. As a result, the
flyout is not displayed when the application is run on the Android
platform.

### Description of Changes
Retrieved the default value using the GetDefaultValue method from the
bindable property and handled the target setter case in the
OnIdiomExtension when the value is null due to the absence of a
specified value for the current idiom.

### Reference


https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74

### Issues Fixed
Fixes #13243 

Validated the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac

### Output

Android

|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/b24347f6-8f56-4fa7-b8c1-d29778711b89"
>| <video
src="https://github.com/user-attachments/assets/6cc923eb-072c-468d-bf9b-c7dfc74c8a28"
>|


iOS

|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/dd861cc8-b80f-4af7-b581-cb50889b553d"
>| <video
src="https://github.com/user-attachments/assets/78966ebb-6f4e-4500-b414-5072c7305813">|
github-actions Bot pushed a commit that referenced this pull request May 6, 2026
…r Desktop via OnIdiom (#29028)

### Issue Details

The Shell flyout is not displayed due to the absence of a specified
FlyoutWidth value for the current idiom, and no default value is
provided in the OnIdiom.

### Root Cause
The FlyoutWidth property returns a value of 0 instead of its default
value (-1) from the OnIdiom extension when FlyoutWidth is set only for
the Desktop idiom and no default value is provided. As a result, the
flyout is not displayed when the application is run on the Android
platform.

### Description of Changes
Retrieved the default value using the GetDefaultValue method from the
bindable property and handled the target setter case in the
OnIdiomExtension when the value is null due to the absence of a
specified value for the current idiom.

### Reference


https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74

### Issues Fixed
Fixes #13243 

Validated the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac

### Output

Android

|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/b24347f6-8f56-4fa7-b8c1-d29778711b89"
>| <video
src="https://github.com/user-attachments/assets/6cc923eb-072c-468d-bf9b-c7dfc74c8a28"
>|


iOS

|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/dd861cc8-b80f-4af7-b581-cb50889b553d"
>| <video
src="https://github.com/user-attachments/assets/78966ebb-6f4e-4500-b414-5072c7305813">|
@github-actions github-actions Bot locked and limited conversation to collaborators May 19, 2026
@kubaflo kubaflo added the s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) label May 20, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-controls-flyout Flyout community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration platform/android s/agent-approved AI agent recommends approval - PR fix is correct and optimal s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] FlyoutWidth with OnIdiom shows no flyout

8 participants