XamarinCommunityToolkit
XamarinCommunityToolkit copied to clipboard
[Bug] Tabview explicit/default style with TabStripBackgroundColor generates Null exception
Description
If I set an explicit/default style for the TabView in my App.xaml resources, the app will crash when it tries to show the TabView. This only happens if I set the TabStripBackgroundColor property.
Steps to Reproduce
- Add these lines to the App.xaml file:
<Style TargetType="xct:TabView" x:Key="DefaultTabViewStyle">
<Setter Property="TabStripBackgroundColor" Value="Red"/>
<Setter Property="TabIndicatorColor" Value="White"/>
</Style>
<Style TargetType="xct:TabView" BasedOn="{StaticResource DefaultTabViewStyle}"/>
- Add a TabView to the MainPage.xaml
<xct:TabView>
<xct:TabViewItem Text="Test">
<grid>
</grid>
</xct:TabViewItem>
</xct:TabView>
- Run the app
Expected Behavior
A TabView with a red strip should appears in the MainPage.
Actual Behavior
The app crashes with the following exception: (extracted from Android)
**System.Reflection.TargetInvocationException:** 'Exception has been thrown by the target of an invocation.'
[mono-rt] [ERROR] FATAL UNHANDLED EXCEPTION: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.
[mono-rt] at Xamarin.CommunityToolkit.UI.Views.TabView.UpdateTabStripBackgroundColor (Xamarin.Forms.Color tabStripBackgroundColor) [0x00000] in <5265966be8d2407fb7a4c3b38c6441d7>:0
[mono-rt] at Xamarin.CommunityToolkit.UI.Views.TabView.OnTabStripBackgroundColorChanged (Xamarin.Forms.BindableObject bindable, System.Object oldValue, System.Object newValue) [0x0000a] in <5265966be8d2407fb7a4c3b38c6441d7>:0
[mono-rt] at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindableObject+BindablePropertyContext context, System.Object value, System.Boolean currentlyApplying, Xamarin.Forms.Internals.SetValueFlags attributes, System.Boolean silent) [0x00120] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:512
[mono-rt] at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes, Xamarin.Forms.BindableObject+SetValuePrivateFlags privateAttributes) [0x00173] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:446
[mono-rt] at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value, System.Boolean fromStyle, System.Boolean checkAccess) [0x0004d] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:374
[mono-rt] at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value, System.Boolean fromStyle) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:359
[mono-rt] at Xamarin.Forms.Setter.Apply (Xamarin.Forms.BindableObject target, System.Boolean fromStyle) [0x000fa] in D:\a\1\s\Xamarin.Forms.Core\Setter.cs:85
[mono-rt] at Xamarin.Forms.Style.ApplyCore (Xamarin.Forms.BindableObject bindable, Xamarin.Forms.Style basedOn) [0x0001e] in D:\a\1\s\Xamarin.Forms.Core\Style.cs:129
[mono-rt] at Xamarin.Forms.Style.Xamarin.Forms.IStyle.Apply (Xamarin.Forms.BindableObject bindable) [0x0002b] in D:\a\1\s\Xamarin.Forms.Core\Style.cs:91
[mono-rt] at Xamarin.Forms.Style.ApplyCore (Xamarin.Forms.BindableObject bindable, Xamarin.Forms.Style basedOn) [0x00003] in D:\a\1\s\Xamarin.Forms.Core\Style.cs:126
[mono-rt] at Xamarin.Forms.Style.Xamarin.Forms.IStyle.Apply (Xamarin.Forms.BindableObject bindable) [0x0002b] in D:\a\1\s\Xamarin.Forms.Core\Style.cs:91
[mono-rt] at Xamarin.Forms.MergedStyle.SetStyle (Xamarin.Forms.IStyle implicitStyle, System.Collections.Generic.IList`1[T] classStyles, Xamarin.Forms.IStyle style) [0x000f8] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:192
[mono-rt] at Xamarin.Forms.MergedStyle.set_ImplicitStyle (Xamarin.Forms.IStyle value) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:91
[mono-rt] at Xamarin.Forms.MergedStyle.OnImplicitStyleChanged () [0x00038] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:130
[mono-rt] at Xamarin.Forms.MergedStyle.<RegisterImplicitStyles>b__30_0 (Xamarin.Forms.BindableObject bindable, System.Object oldvalue, System.Object newvalue) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:146
[mono-rt] at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindableObject+BindablePropertyContext context, System.Object value, System.Boolean currentlyApplying, Xamarin.Forms.Internals.SetValueFlags attributes, System.Boolean silent) [0x00120] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:512
[mono-rt] at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes, Xamarin.Forms.BindableObject+SetValuePrivateFlags privateAttributes) [0x00173] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:446
[mono-rt] at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:383
[mono-rt] at Xamarin.Forms.Element.OnResourceChanged (Xamarin.Forms.BindablePro
Basic Information
- Version with issue: 1.1.0
- Last known good version: N/D
- IDE: Visual Studio 2019 Community (16.9.5)
- Platform Target Frameworks:
- iOS: 12.1
- Android:
- Compilation: 10.0 (Q)
- Minimum: 5.0 (Lollipop)
- Target: 10.0 (Q)
- Nuget Packages: Xamarin.CommunityToolkit (1.1.0), Xamarin.Essentials (1.6.1), Xamarin.Forms (5.0.0.2012), Xamarin.Forms.Visual.Material (5.0.0.2012)
- Affected Devices:
- Android: Nokia 7.2 with Android 10
- iOS: iPhone 6 with iOS 12.5.2
Workaround
Load the style using implicit referencing. i.e.:
App.xaml:
<Style TargetType="xct:TabView" x:Key="DefaultTabViewStyle">
<Setter Property="TabStripBackgroundColor" Value="Red"/>
<Setter Property="TabIndicatorColor" Value="White"/>
</Style>
<!--<Style TargetType="xct:TabView" BasedOn="{StaticResource DefaultTabViewStyle}"/>-->
MainPage.xaml
<xct:TabView Style="{StaticResource DefaultTabViewStyle}">
<xct:TabViewItem Text="Test">
<grid>
</grid>
</xct:TabViewItem>
</xct:TabView>
I'm seeing the same issue when setting any property on TabView using implicit styles, not just TabStripBackgroundColor. For example this style also generates a NullReferenceException:
<Style TargetType="xct:TabView">
<Setter Property="TabStripHeight" Value="40"/>
</Style>
Stack trace from App Center:
Xamarin Exception Stack:
System.NullReferenceException: Object reference not set to an instance of an object.
at Xamarin.CommunityToolkit.UI.Views.TabView.UpdateTabStripHeight (System.Double tabStripHeight) [0x00000] in <5265966be8d2407fb7a4c3b38c6441d7>:0
at Xamarin.CommunityToolkit.UI.Views.TabView.OnTabStripHeightChanged (Xamarin.Forms.BindableObject bindable, System.Object oldValue, System.Object newValue) [0x0000a] in <5265966be8d2407fb7a4c3b38c6441d7>:0
at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindableObject+BindablePropertyContext context, System.Object value, System.Boolean currentlyApplying, Xamarin.Forms.Internals.SetValueFlags attributes, System.Boolean silent) [0x00120] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:512
at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes, Xamarin.Forms.BindableObject+SetValuePrivateFlags privateAttributes) [0x00173] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:446
at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value, System.Boolean fromStyle, System.Boolean checkAccess) [0x0004d] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:374
at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value, System.Boolean fromStyle) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:359
at Xamarin.Forms.Setter.Apply (Xamarin.Forms.BindableObject target, System.Boolean fromStyle) [0x000fa] in D:\a\1\s\Xamarin.Forms.Core\Setter.cs:85
at Xamarin.Forms.Style.ApplyCore (Xamarin.Forms.BindableObject bindable, Xamarin.Forms.Style basedOn) [0x0001e] in D:\a\1\s\Xamarin.Forms.Core\Style.cs:129
at Xamarin.Forms.Style.Xamarin.Forms.IStyle.Apply (Xamarin.Forms.BindableObject bindable) [0x0002b] in D:\a\1\s\Xamarin.Forms.Core\Style.cs:91
at Xamarin.Forms.MergedStyle.SetStyle (Xamarin.Forms.IStyle implicitStyle, System.Collections.Generic.IList`1[T] classStyles, Xamarin.Forms.IStyle style) [0x000f8] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:192
at Xamarin.Forms.MergedStyle.set_ImplicitStyle (Xamarin.Forms.IStyle value) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:91
at Xamarin.Forms.MergedStyle.OnImplicitStyleChanged () [0x00038] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:130
at Xamarin.Forms.MergedStyle.<RegisterImplicitStyles>b__30_0 (Xamarin.Forms.BindableObject bindable, System.Object oldvalue, System.Object newvalue) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:146
at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindableObject+BindablePropertyContext context, System.Object value, System.Boolean currentlyApplying, Xamarin.Forms.Internals.SetValueFlags attributes, System.Boolean silent) [0x00120] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:512
at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes, Xamarin.Forms.BindableObject+SetValuePrivateFlags privateAttributes) [0x00173] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:446
at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:383
at Xamarin.Forms.Element.OnResourceChanged (Xamarin.Forms.BindableProperty property, System.Object value) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:599
at Xamarin.Forms.Element.OnSetDynamicResource (Xamarin.Forms.BindableProperty property, System.String key) [0x00020] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:472
at Xamarin.Forms.BindableObject.SetDynamicResource (Xamarin.Forms.BindableProperty property, System.String key, System.Boolean fromStyle) [0x00066] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:346
at Xamarin.Forms.BindableObject.SetDynamicResource (Xamarin.Forms.BindableProperty property, System.String key) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:327
at Xamarin.Forms.MergedStyle.RegisterImplicitStyles () [0x00044] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:148
at Xamarin.Forms.MergedStyle..ctor (System.Type targetType, Xamarin.Forms.BindableObject target) [0x0001f] in D:\a\1\s\Xamarin.Forms.Core\MergedStyle.cs:31
at Xamarin.Forms.NavigableElement..ctor () [0x00011] in D:\a\1\s\Xamarin.Forms.Core\Shell\NavigableElement.cs:24
at Xamarin.Forms.VisualElement..ctor () [0x00059] in D:\a\1\s\Xamarin.Forms.Core\VisualElement.cs:367
at Xamarin.Forms.View..ctor () [0x0000b] in D:\a\1\s\Xamarin.Forms.Core\View.cs:75
at Xamarin.Forms.Layout..ctor () [0x00028] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:67
at Xamarin.Forms.TemplatedView..ctor () <0x5b1fc6a0 + 0x00043> in <978ec34c5c9c4c4eb3d73b6da958bcd6>:0
at Xamarin.Forms.ContentView..ctor () <0x5b1fc620 + 0x00043> in <978ec34c5c9c4c4eb3d73b6da958bcd6>:0
at Xamarin.CommunityToolkit.UI.Views.TabView..ctor () [0x00000] in <5265966be8d2407fb7a4c3b38c6441d7>:0
at EliteALD.Views.SettingsPage.InitializeComponent () [0x00012] in D:\Dev\Csharp\ALD\src\EliteALD\EliteALD\EliteALD\obj\Debug\netstandard2.0\Views\SettingsPage.xaml.g.cs:22
I can confirm that this bug is still in the latest version of the toolkit. And it is related to all properties.
The easiest workaround is to set the x:Key attribute and use an explicit style.