Skip to content

FlyoutPage.IsPresented behaves different to Xamarin 5 #10101

Open
@jbe2277

Description

@jbe2277

Description

The documentation shows that IsPresented must be set to false so that the flyout closes on phones:

void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var item = e.CurrentSelection.FirstOrDefault() as FlyoutPageItem;
    if (item != null)
    {            
        Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
        IsPresented = false;
    }
}

But this code throws an exception on the Windows platform:

if ((!(bool)newValue) && sender is IFlyoutPageController fpc && fpc.ShouldShowSplitMode && sender is FlyoutPage fp)
{
throw new InvalidOperationException(string.Format("Can't change IsPresented when setting {0}", fp.FlyoutLayoutBehavior));
}

Please, update the documentation. See workaround.

Xamarin: The behavior changed since Xamarin 5. In Xamarin I have used:
https://github.com/jbe2277/waf/blob/acbf97f70736203b47e5e99d399d691d6121fb0f/src/NewsReader/NewsReader.Presentation/Views/ShellView.xaml.cs#L64

This doesn't work correct anymore. The exception is raised on the Windows platform.

Maybe related: #9801

Steps to Reproduce

Clone this repo:
https://github.com/jbe2277/waf/tree/b42f0f1a26287dce428f3c34a2c90b4a7d2aeab7

Link to public reproduction project repository

https://github.com/jbe2277/waf/tree/b42f0f1a26287dce428f3c34a2c90b4a7d2aeab7

Version with bug

6.0.486 (current)

Last version that worked well

Unknown/Other

Affected platforms

Windows

Affected platform versions

net6.0-windows10.0.19041.0

Did you find any workaround?

This commit solved the issue:
jbe2277/waf@69803ce

The important part is:

if (!((IFlyoutPageController)this).ShouldShowSplitMode) IsPresented = false;

I believe this API has some flaws:

  1. It's necessary to cast this so that ShouldShowSplitMode can be accessed. However, this is a main use case and so it should be accessible directly via FlyoutPage.
  2. The CanChangeIsPresented property which I used first for the check doesn't work as expected. Although the property returned true, setting of IsPresented = false resulted in the exception.

Relevant log output

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions