Description
In my Log In page implementation, if user is not logged in - I populate Shell with LogInPage only.
And when user is logged in - I replace Items with actual items.
Unfortunately, this scenario leads to crash on Android.
(It works fine if user is already logged in)
Steps to Reproduce
Shell implementation
namespace ShellBugRepro
{
public class AppShell : Shell
{
public AppShell()
{
Items.Add(new LogInPage(this));
}
public void LoggedIn()
{
Items.Clear();
Items.Add(new Page1());
Items.Add(new Page2());
}
}
public class LogInPage : ContentPage
{
public LogInPage(AppShell shell)
{
Title = "LogIn Page";
var button = new Button { Text = "Click Me to Log In!" };
button.Clicked += (_, _) => shell.LoggedIn();
Content = new VerticalStackLayout
{
Children = { button }
};
}
}
public class Page1 : ContentPage
{
public Page1()
{
Title = "Page 1";
Content = new VerticalStackLayout
{
Children = { new Label { Text = "Just a first page, nothing fancy." } }
};
}
}
public class Page2 : ContentPage
{
public Page2()
{
Title = "Page 2";
Content = new VerticalStackLayout
{
Children = { new Label { Text = "Just a second page, nothing fancy." } }
};
}
}
}
- Open repro project.
- Click on Click Me button.
- Click on Flyout menu button.
ER:
Flyout is opened.
AR:
Java.Lang.IllegalArgumentException: 'No drawer view found with gravity LEFT'
Link to public reproduction project repository
https://github.com/Dreamescaper/maui-repro-28078
Version with bug
9.0.40 SR4
Is this a regression from previous behavior?
Not sure, did not test other versions
Affected platforms
Android
Affected platform versions
Android 15
Relevant log output
[EGL_emulation] app_time_stats: avg=3112.41ms min=4.89ms max=21510.78ms count=7
Thread started: <Thread Pool> #12
Thread started: <Thread Pool> #13
[WindowOnBackDispatcher] OnBackInvokedCallback is not enabled for the application.
[WindowOnBackDispatcher] Set 'android:enableOnBackInvokedCallback="true"' in the application manifest.
Thread started: <Thread Pool> #14
[TabLayout] MODE_SCROLLABLE + GRAVITY_FILL is not supported, GRAVITY_START will be used instead
Thread started: <Thread Pool> #15
[AndroidRuntime] Shutting down VM
[AndroidRuntime] FATAL EXCEPTION: main
[AndroidRuntime] Process: com.companyname.shellbugrepro, PID: 9792
[AndroidRuntime] java.lang.IllegalArgumentException: No drawer view found with gravity LEFT
[AndroidRuntime] at androidx.drawerlayout.widget.DrawerLayout.openDrawer(DrawerLayout.java:1793)
[AndroidRuntime] at androidx.drawerlayout.widget.DrawerLayout.openDrawer(DrawerLayout.java:1779)
[AndroidRuntime] at androidx.appcompat.app.ActionBarDrawerToggle.toggle(ActionBarDrawerToggle.java:286)
[AndroidRuntime] at androidx.appcompat.app.ActionBarDrawerToggle$1.onClick(ActionBarDrawerToggle.java:201)
[AndroidRuntime] at android.view.View.performClick(View.java:8028)
[AndroidRuntime] at android.view.View.performClickInternal(View.java:8005)
[AndroidRuntime] at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
[AndroidRuntime] at android.view.View$PerformClick.run(View.java:31229)
[AndroidRuntime] at android.os.Handler.handleCallback(Handler.java:959)
[AndroidRuntime] at android.os.Handler.dispatchMessage(Handler.java:100)
[AndroidRuntime] at android.os.Looper.loopOnce(Looper.java:232)
[AndroidRuntime] at android.os.Looper.loop(Looper.java:317)
[AndroidRuntime] at android.app.ActivityThread.main(ActivityThread.java:8705)
[AndroidRuntime] at java.lang.reflect.Method.invoke(Native Method)
[AndroidRuntime] at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
[AndroidRuntime] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
[EGL_emulation] app_time_stats: avg=58.95ms min=2.94ms max=1368.37ms count=31
**Java.Lang.IllegalArgumentException:** 'No drawer view found with gravity LEFT'
[EGL_emulation] app_time_stats: avg=16.43ms min=12.01ms max=24.33ms count=60
[EGL_emulation] app_time_stats: avg=16.41ms min=11.47ms max=18.85ms count=61
[EGL_emulation] app_time_stats: avg=15.83ms min=7.94ms max=20.43ms count=60
[EGL_emulation] app_time_stats: avg=16.08ms min=5.64ms max=21.86ms count=61
[EGL_emulation] app_time_stats: avg=3.66ms min=2.22ms max=30.18ms count=60
[EGL_emulation] app_time_stats: avg=3.00ms min=2.02ms max=4.23ms count=61
[monodroid-assembly] Shared library 'liblog' not loaded, p/invoke '__android_log_print' may fail
[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] Java.Lang.IllegalArgumentException: No drawer view found with gravity LEFT
[MonoDroid]
[MonoDroid] --- End of managed Java.Lang.IllegalArgumentException stack trace ---
[MonoDroid] java.lang.IllegalArgumentException: No drawer view found with gravity LEFT
[MonoDroid] at androidx.drawerlayout.widget.DrawerLayout.openDrawer(DrawerLayout.java:1793)
[MonoDroid] at androidx.drawerlayout.widget.DrawerLayout.openDrawer(DrawerLayout.java:1779)
[MonoDroid] at androidx.appcompat.app.ActionBarDrawerToggle.toggle(ActionBarDrawerToggle.java:286)
[MonoDroid] at androidx.appcompat.app.ActionBarDrawerToggle$1.onClick(ActionBarDrawerToggle.java:201)
[MonoDroid] at android.view.View.performClick(View.java:8028)
[MonoDroid] at android.view.View.performClickInternal(View.java:8005)
[MonoDroid] at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
[MonoDroid] at android.view.View$PerformClick.run(View.java:31229)
[MonoDroid] at android.os.Handler.handleCallback(Handler.java:959)
[MonoDroid] at android.os.Handler.dispatchMessage(Handler.java:100)
[MonoDroid] at android.os.Looper.loopOnce(Looper.java:232)
[MonoDroid] at android.os.Looper.loop(Looper.java:317)
[MonoDroid] at android.app.ActivityThread.main(ActivityThread.java:8705)
[MonoDroid] at java.lang.reflect.Method.invoke(Native Method)
[MonoDroid] at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
[MonoDroid] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
[MonoDroid]
[MonoDroid] --- End of managed Java.Lang.IllegalArgumentException stack trace ---
[MonoDroid] java.lang.IllegalArgumentException: No drawer view found with gravity LEFT
[MonoDroid] at androidx.drawerlayout.widget.DrawerLayout.openDrawer(DrawerLayout.java:1793)
[MonoDroid] at androidx.drawerlayout.widget.DrawerLayout.openDrawer(DrawerLayout.java:1779)
[MonoDroid] at androidx.appcompat.app.ActionBarDrawerToggle.toggle(ActionBarDrawerToggle.java:286)
[MonoDroid] at androidx.appcompat.app.ActionBarDrawerToggle$1.onClick(ActionBarDrawerToggle.java:201)
[MonoDroid] at android.view.View.performClick(View.java:8028)
[MonoDroid] at android.view.View.performClickInternal(View.java:8005)
[MonoDroid] at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
[MonoDroid] at android.view.View$PerformClick.run(View.java:31229)
[MonoDroid] at android.os.Handler.handleCallback(Handler.java:959)
[MonoDroid] at android.os.Handler.dispatchMessage(Handler.java:100)
[MonoDroid] at android.os.Looper.loopOnce(Looper.java:232)
[MonoDroid] at android.os.Looper.loop(Looper.java:317)
[MonoDroid] at android.app.ActivityThread.main(ActivityThread.java:8705)
[MonoDroid] at java.lang.reflect.Method.invoke(Native Method)
[MonoDroid] at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
[MonoDroid] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
[MonoDroid]
Recording

Description
In my Log In page implementation, if user is not logged in - I populate Shell with LogInPage only.
And when user is logged in - I replace Items with actual items.
Unfortunately, this scenario leads to crash on Android.
(It works fine if user is already logged in)
Steps to Reproduce
Shell implementation
ER:
Flyout is opened.
AR:
Java.Lang.IllegalArgumentException: 'No drawer view found with gravity LEFT'
Link to public reproduction project repository
https://github.com/Dreamescaper/maui-repro-28078
Version with bug
9.0.40 SR4
Is this a regression from previous behavior?
Not sure, did not test other versions
Affected platforms
Android
Affected platform versions
Android 15
Relevant log output
Recording