XamarinCommunityToolkit icon indicating copy to clipboard operation
XamarinCommunityToolkit copied to clipboard

[Bug] Tabview explicit/default style with TabStripBackgroundColor generates Null exception

Open JPZV opened this issue 4 years ago • 2 comments

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

  1. 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}"/>
  1. Add a TabView to the MainPage.xaml
<xct:TabView>
    <xct:TabViewItem Text="Test">
        <grid>
        </grid>
    </xct:TabViewItem>
</xct:TabView>
  1. 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>

JPZV avatar May 12 '21 16:05 JPZV

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

irongut avatar Jul 05 '21 22:07 irongut

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.

tsjdev-apps avatar Apr 09 '22 15:04 tsjdev-apps