Skip to content

Conversation

@vnbaaij
Copy link
Collaborator

@vnbaaij vnbaaij commented Oct 21, 2025

More fixes for #4248:

  • Make the IJSObjectReferences nullable
  • Set them to null in DisposeAsync
  • Also check DotNetObjectReference in OnAfterRenderAsync

I'll wait with merging this time till we are all on the same page :)

@vnbaaij vnbaaij added this to the v4.13.1 milestone Oct 21, 2025
@vnbaaij vnbaaij requested a review from dvoituron as a code owner October 21, 2025 15:12
@MarvinKlein1508
Copy link
Collaborator

@vnbaaij for me it is still not working. I still get a disposed error:

System.ObjectDisposedException: Cannot access a disposed object.
      Object name: 'Microsoft.JSInterop.DotNetObjectReference`1[[Microsoft.FluentUI.AspNetCore.Components.FluentMenu, Microsoft.FluentUI.AspNetCore.Components, Version=4.13.1.0, Culture=neutral, PublicKeyToken=null]]'.
         at Microsoft.JSInterop.JSRuntime.TrackObjectReference[TValue](DotNetObjectReference`1 dotNetObjectReference)
         at Microsoft.JSInterop.Infrastructure.DotNetObjectReferenceJsonConverter`1.Write(Utf8JsonWriter writer, DotNetObjectReference`1 value, JsonSerializerOptions options)
         at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
         at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
         at System.Text.Json.Serialization.JsonCollectionConverter`2.OnTryWrite(Utf8JsonWriter writer, TCollection value, JsonSerializerOptions options, WriteStack& state)
         at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
         at System.Text.Json.Serialization.JsonConverter`1.WriteCore(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
         at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Serialize(Utf8JsonWriter writer, T& rootValue, Object rootValueBoxed)
         at System.Text.Json.JsonSerializer.WriteString[TValue](TValue& value, JsonTypeInfo`1 jsonTypeInfo)
         at Microsoft.JSInterop.JSRuntime.InvokeAsync[TValue](Int64 targetInstanceId, String identifier, CancellationToken cancellationToken, Object[] args)
         at Microsoft.JSInterop.JSRuntime.InvokeAsync[TValue](Int64 targetInstanceId, String identifier, Object[] args)
         at Microsoft.JSInterop.JSObjectReferenceExtensions.InvokeVoidAsync(IJSObjectReference jsObjectReference, String identifier, Object[] args)
         at Microsoft.FluentUI.AspNetCore.Components.FluentMenu.OnAfterRenderAsync(Boolean firstRender) in E:\fluentui-blazor\src\Core\Components\Menu\FluentMenu.razor.cs:line 245
         at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)

This can be reproduced with the steps from this: #4248 (comment)

@Tyme-Bleyaert
Copy link
Collaborator

I'm gonna check it out this evening, might join this pr for some pair programming :)

@MarvinKlein1508
Copy link
Collaborator

@vnbaaij I set up a try catch here to debug this and the root of this issue is that the dotNetReference has been disposed but is not null.
grafik

@github-actions
Copy link

github-actions bot commented Oct 22, 2025

✅ All tests passed successfully

Details on your Workflow / Core Tests page.

@MarvinKlein1508
Copy link
Collaborator

@vnbaaij I found a working solution. In line 28 add:

private bool _disposed;

In line 244 change to:

if (_jsModule is not null && _anchoredRegionModule is not null && _dotNetHelper is not null && !_disposed)

as well in line 251 to:

if (_jsModule is not null && _anchoredRegionModule is not null && _dotNetHelper is not null && !_disposed && _reinitializeEventListeners)

And then update the dispose method to:

public async ValueTask DisposeAsync()
{
    if (_disposed)
    {
        return;
    }

    _disposed = true;
    _dotNetHelper?.Dispose();

    try
    {
        if (_jsModule is not null)
        {
            await _jsModule.InvokeVoidAsync("dispose", Anchor);
            await _jsModule.DisposeAsync();
            _jsModule = null;
        }

        if (_anchoredRegionModule is not null)
        {
            await _anchoredRegionModule.DisposeAsync();
            _anchoredRegionModule = null;
        }
    }
    catch (Exception ex) when (ex is JSDisconnectedException ||
                               ex is OperationCanceledException)
    {
        // The JSRuntime side may routinely be gone already if the reason we're disposing is that
        // the client disconnected. This is not an error.
    }
    finally
    {
        GC.SuppressFinalize(this);
    }
}

@github-actions
Copy link

github-actions bot commented Oct 22, 2025

Summary - Unit Tests Code Coverage

Summary
Generated on: 10/23/2025 - 11:55:42 AM
Coverage date: 10/23/2025 - 11:55:32 AM
Parser: Cobertura
Assemblies: 1
Classes: 255
Files: 365
Line coverage: 61.2% (6216 of 10153)
Covered lines: 6216
Uncovered lines: 3937
Coverable lines: 10153
Total lines: 34176
Branch coverage: 53.1% (3134 of 5895)
Covered branches: 3134
Total branches: 5895
Method coverage: Feature is only available for sponsors
Tag: 4485_18747410759

Coverage

Microsoft.FluentUI.AspNetCore.Components - 61.2%
Name Line Branch
Microsoft.FluentUI.AspNetCore.Components 61.2% 53.1%
Microsoft.FluentUI.AspNetCore.Components.AccordionChangeEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.ActionButton`1 50%
Microsoft.FluentUI.AspNetCore.Components.ActionLink`1 0%
Microsoft.FluentUI.AspNetCore.Components.CalendarExtended 95% 86.6%
Microsoft.FluentUI.AspNetCore.Components.CalendarTitles 87% 76.6%
Microsoft.FluentUI.AspNetCore.Components.CheckboxChangeEventArgs 50%
Microsoft.FluentUI.AspNetCore.Components.ColumnBase`1 25.8% 20.8%
Microsoft.FluentUI.AspNetCore.Components.ColumnKeyGridSort`1 0% 0%
Microsoft.FluentUI.AspNetCore.Components.ColumnOptionsLabels 80%
Microsoft.FluentUI.AspNetCore.Components.ColumnResizeLabels 90.9%
Microsoft.FluentUI.AspNetCore.Components.ColumnResizeOptions`1 0% 0%
Microsoft.FluentUI.AspNetCore.Components.ColumnSortLabels 85.7%
Microsoft.FluentUI.AspNetCore.Components.CommunicationToast 0% 0%
Microsoft.FluentUI.AspNetCore.Components.CommunicationToastContent 0%
Microsoft.FluentUI.AspNetCore.Components.ComponentParameters 16.6% 0%
Microsoft.FluentUI.AspNetCore.Components.Components.DateTime.RangeOfDates 100% 50%
Microsoft.FluentUI.AspNetCore.Components.Components.Tooltip.TooltipGlobalOp
tions
40%
Microsoft.FluentUI.AspNetCore.Components.Components.Tooltip.TooltipOptions 0%
Microsoft.FluentUI.AspNetCore.Components.Components.Tooltip.TooltipService 57.5% 30%
Microsoft.FluentUI.AspNetCore.Components.ConfirmationToast 0%
Microsoft.FluentUI.AspNetCore.Components.CountdownTimer 0% 0%
Microsoft.FluentUI.AspNetCore.Components.CustomEmoji 0% 0%
Microsoft.FluentUI.AspNetCore.Components.CustomIcon 0%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.AsyncQuery
ExecutorSupplier
38.4% 43.7%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.ColumnsCol
lectedNotifier`1
87.5% 50%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.Defer 100%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.DisplayAtt
ributeExtensions
66.6% 50%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.InternalGr
idContext`1
90.4% 100%
Microsoft.FluentUI.AspNetCore.Components.DataGridCellFocusEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.DataGridRowFocusEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.DialogEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.DialogHelper 0%
Microsoft.FluentUI.AspNetCore.Components.DialogInstance 86.6% 75%
Microsoft.FluentUI.AspNetCore.Components.DialogParameters 91.1% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogParameters`1 100%
Microsoft.FluentUI.AspNetCore.Components.DialogReference 36.3% 37.5%
Microsoft.FluentUI.AspNetCore.Components.DialogResult 0% 0%
Microsoft.FluentUI.AspNetCore.Components.DialogService 4.1% 2.6%
Microsoft.FluentUI.AspNetCore.Components.Emoji 0% 0%
Microsoft.FluentUI.AspNetCore.Components.EmojiCompress 0% 0%
Microsoft.FluentUI.AspNetCore.Components.EmojiExtensions 0% 0%
Microsoft.FluentUI.AspNetCore.Components.EmojiInfo 0%
Microsoft.FluentUI.AspNetCore.Components.Extensions.AdditionalAttributesExt
ensions
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.BooleanExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.DateTimeExtensions 81.2% 85%
Microsoft.FluentUI.AspNetCore.Components.Extensions.EnumExtensions 70.5% 59%
Microsoft.FluentUI.AspNetCore.Components.Extensions.FluentInputExtensions 25.9% 16.6%
Microsoft.FluentUI.AspNetCore.Components.Extensions.UrlFormatterExtensions 100% 75%
Microsoft.FluentUI.AspNetCore.Components.FluentAccessibilityStatus 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentAccordion 59.2% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentAccordionItem 78.5% 35.7%
Microsoft.FluentUI.AspNetCore.Components.FluentAnchor 90% 67.8%
Microsoft.FluentUI.AspNetCore.Components.FluentAnchoredRegion 87.7% 60%
Microsoft.FluentUI.AspNetCore.Components.FluentAppBar 64.6% 42.1%
Microsoft.FluentUI.AspNetCore.Components.FluentAppBarItem 85.2% 60%
Microsoft.FluentUI.AspNetCore.Components.FluentAutocomplete`1 85.7% 71.8%
Microsoft.FluentUI.AspNetCore.Components.FluentBadge 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentBodyContent 100%
Microsoft.FluentUI.AspNetCore.Components.FluentBreadcrumb 100%
Microsoft.FluentUI.AspNetCore.Components.FluentBreadcrumbItem 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentButton 84.3% 64.5%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendar 83.4% 78.3%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarBase 93.7% 81.2%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarDay 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarMonth 92.3% 64.2%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarYear 84.6% 58.3%
Microsoft.FluentUI.AspNetCore.Components.FluentCard 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCheckbox 91.1% 87%
Microsoft.FluentUI.AspNetCore.Components.FluentCollapsibleRegion 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCombobox`1 69% 57.6%
Microsoft.FluentUI.AspNetCore.Components.FluentComponentBase 90.9% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentCounterBadge 92.3% 84.8%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGrid`1 57.3% 48.6%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridCell`1 80% 73.9%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridRow`1 56.2% 37.5%
Microsoft.FluentUI.AspNetCore.Components.FluentDatePicker 81.8% 51.9%
Microsoft.FluentUI.AspNetCore.Components.FluentDesignSystemProvider 100% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentDesignTheme 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentDialog 57.3% 60%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogBody 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogFooter 66.6% 44.1%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogHeader 85.1% 75%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogProvider 56.4% 53.4%
Microsoft.FluentUI.AspNetCore.Components.FluentDivider 86.9% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDragContainer`1 71.4%
Microsoft.FluentUI.AspNetCore.Components.FluentDragEventArgs`1 0%
Microsoft.FluentUI.AspNetCore.Components.FluentDropZone`1 22.2% 4.3%
Microsoft.FluentUI.AspNetCore.Components.FluentEditForm 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentEmoji`1 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentFlipper 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFooter 100%
Microsoft.FluentUI.AspNetCore.Components.FluentGrid 72.2% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentGridItem 87.5% 82.5%
Microsoft.FluentUI.AspNetCore.Components.FluentHeader 100%
Microsoft.FluentUI.AspNetCore.Components.FluentHighlighter 80% 20%
Microsoft.FluentUI.AspNetCore.Components.FluentHorizontalScroll 60.6% 20%
Microsoft.FluentUI.AspNetCore.Components.FluentIcon`1 88.3% 81.2%
Microsoft.FluentUI.AspNetCore.Components.FluentInputBase`1 69% 61.2%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFile 90% 79.6%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileBuffer 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileEventArgs 92.3%
Microsoft.FluentUI.AspNetCore.Components.FluentInputLabel 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCode 88.6% 90%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCodeEventArgs 100% 75%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCodeProvider 40% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentLabel 98% 88.8%
Microsoft.FluentUI.AspNetCore.Components.FluentLayout 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentListbox`1 94.4% 83.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMain 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMainLayout 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMenu 60.4% 51.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuButton 73.1% 25%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuItem 74% 41.6%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuProvider 95.2% 83.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMessageBar 50.4% 24.1%
Microsoft.FluentUI.AspNetCore.Components.FluentMessageBarProvider 70.4% 59%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitter 81.7% 66.6%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterPane 97.1% 91%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterResizeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNavBase 55.1% 16.6%
Microsoft.FluentUI.AspNetCore.Components.FluentNavGroup 62.3% 35.4%
Microsoft.FluentUI.AspNetCore.Components.FluentNavLink 55.2% 40.6%
Microsoft.FluentUI.AspNetCore.Components.FluentNavMenu 61.1% 33.3%
Microsoft.FluentUI.AspNetCore.Components.FluentNavMenuGroup 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentNavMenuItemBase 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentNavMenuLink 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentNavMenuTree 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentNumberField`1 63.8% 55.1%
Microsoft.FluentUI.AspNetCore.Components.FluentOption`1 80% 61.5%
Microsoft.FluentUI.AspNetCore.Components.FluentOverflow 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentOverflowItem 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentOverlay 74% 62%
Microsoft.FluentUI.AspNetCore.Components.FluentPageScript 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPaginator 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentPersona 100% 78.1%
Microsoft.FluentUI.AspNetCore.Components.FluentPopover 78.4% 65.9%
Microsoft.FluentUI.AspNetCore.Components.FluentPresenceBadge 60.9% 29.1%
Microsoft.FluentUI.AspNetCore.Components.FluentProfileMenu 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentProgress 81.2% 68.1%
Microsoft.FluentUI.AspNetCore.Components.FluentProgressRing 97.6% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentPullToRefresh 94% 89.2%
Microsoft.FluentUI.AspNetCore.Components.FluentRadio`1 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentRadioContext 70% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentRadioGroup`1 77.7% 16.6%
Microsoft.FluentUI.AspNetCore.Components.FluentRating 76.4% 78.2%
Microsoft.FluentUI.AspNetCore.Components.FluentSearch 88.5% 83.3%
Microsoft.FluentUI.AspNetCore.Components.FluentSelect`1 96.4% 90%
Microsoft.FluentUI.AspNetCore.Components.FluentSkeleton 40.9% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentSlider`1 84.7% 68.4%
Microsoft.FluentUI.AspNetCore.Components.FluentSliderLabel`1 65.8% 33.3%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableList`1 86.9% 59%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableListEventArgs 83.3%
Microsoft.FluentUI.AspNetCore.Components.FluentSpacer 100% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentSplashScreen 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentSplitter 70.7% 40%
Microsoft.FluentUI.AspNetCore.Components.FluentStack 82.9% 33.3%
Microsoft.FluentUI.AspNetCore.Components.FluentSwitch 82.6% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentTab 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentTabs 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentTextArea 85%
Microsoft.FluentUI.AspNetCore.Components.FluentTextField 88.8% 60%
Microsoft.FluentUI.AspNetCore.Components.FluentTimePicker 83.3% 58.3%
Microsoft.FluentUI.AspNetCore.Components.FluentToast 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentToastProvider 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentToolbar 68.9% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentTooltip 68.9% 72.7%
Microsoft.FluentUI.AspNetCore.Components.FluentTooltipProvider 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentTreeItem 89.4% 77.7%
Microsoft.FluentUI.AspNetCore.Components.FluentTreeView 79.7% 65.6%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationMessage`1 0% 0%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationSummary 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentWizard 96% 86.8%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStep 95.8% 88.3%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStepArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStepChangeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.GlobalState 31.8% 50%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderRequest`1 54.5% 20.8%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderResult 100%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderResult`1 100%
Microsoft.FluentUI.AspNetCore.Components.GridSort`1 35.1% 25.9%
Microsoft.FluentUI.AspNetCore.Components.HeaderFooterContent`1 100% 50%
Microsoft.FluentUI.AspNetCore.Components.HorizontalScrollEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.Icon 83.7% 91.1%
Microsoft.FluentUI.AspNetCore.Components.IconFromImage 100%
Microsoft.FluentUI.AspNetCore.Components.IconInfo 100%
Microsoft.FluentUI.AspNetCore.Components.IconsExtensions 0% 0%
Microsoft.FluentUI.AspNetCore.Components.Identifier 66.6% 62.5%
Microsoft.FluentUI.AspNetCore.Components.IdentifierContext 66.6% 41.6%
Microsoft.FluentUI.AspNetCore.Components.IDialogService 0%
Microsoft.FluentUI.AspNetCore.Components.INavMenuItemsOwner 0%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
ibable`1
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
iber`1
100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.InputHelpers`1 62.1% 48.6%
Microsoft.FluentUI.AspNetCore.Components.InternalAppBarContext 100% 100%
Microsoft.FluentUI.AspNetCore.Components.InternalDialogContext 80%
Microsoft.FluentUI.AspNetCore.Components.InternalListContext`1 80% 66.6%
Microsoft.FluentUI.AspNetCore.Components.InternalToastContext 0%
Microsoft.FluentUI.AspNetCore.Components.KeyCodeService 60.3% 28.5%
Microsoft.FluentUI.AspNetCore.Components.KeyDown 0% 0%
Microsoft.FluentUI.AspNetCore.Components.LibraryConfiguration 88.8% 50%
Microsoft.FluentUI.AspNetCore.Components.ListComponentBase`1 61.3% 62.5%
Microsoft.FluentUI.AspNetCore.Components.LoadedEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.LuminanceChangedEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.MenuChangeEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.MenuService 63.8% 0%
Microsoft.FluentUI.AspNetCore.Components.Message 50% 0%
Microsoft.FluentUI.AspNetCore.Components.MessageBox 50% 0%
Microsoft.FluentUI.AspNetCore.Components.MessageBoxContent 0%
Microsoft.FluentUI.AspNetCore.Components.MessageOptions 76.9%
Microsoft.FluentUI.AspNetCore.Components.MessageService 33% 26.9%
Microsoft.FluentUI.AspNetCore.Components.NavMenuActionArgs 0% 0%
Microsoft.FluentUI.AspNetCore.Components.OfficeColorUtilities 0%
Microsoft.FluentUI.AspNetCore.Components.Option`1 0%
Microsoft.FluentUI.AspNetCore.Components.OptionsSearchEventArgs`1 100%
Microsoft.FluentUI.AspNetCore.Components.OverflowItem 100%
Microsoft.FluentUI.AspNetCore.Components.PaginationState 59% 43.7%
Microsoft.FluentUI.AspNetCore.Components.ProgressFileDetails 100%
Microsoft.FluentUI.AspNetCore.Components.ProgressToast 0% 0%
Microsoft.FluentUI.AspNetCore.Components.ProgressToastContent 0%
Microsoft.FluentUI.AspNetCore.Components.PropertyColumn`2 92.5% 71.7%
Microsoft.FluentUI.AspNetCore.Components.RenderFragmentDialog 100%
Microsoft.FluentUI.AspNetCore.Components.Resources.TimeAgoResource 76.1% 100%
Microsoft.FluentUI.AspNetCore.Components.SelectAllTemplateArgs 100%
Microsoft.FluentUI.AspNetCore.Components.SelectColumn`1 87.3% 82%
Microsoft.FluentUI.AspNetCore.Components.SelectDatesHoverEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.ServiceCollectionExtensions 59.2% 66.6%
Microsoft.FluentUI.AspNetCore.Components.SortedProperty 0%
Microsoft.FluentUI.AspNetCore.Components.SplashScreenContent 0% 0%
Microsoft.FluentUI.AspNetCore.Components.SplitterCollapsedEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.SplitterResizedEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.StandardLuminanceExtensions 0% 0%
Microsoft.FluentUI.AspNetCore.Components.TabChangeEventArgs 0%
Microsoft.FluentUI.AspNetCore.Components.TemplateColumn`1 83.3% 0%
Microsoft.FluentUI.AspNetCore.Components.TimeAgoOptions 92.3%
Microsoft.FluentUI.AspNetCore.Components.ToastInstance 0% 0%
Microsoft.FluentUI.AspNetCore.Components.ToastParameters 0%
Microsoft.FluentUI.AspNetCore.Components.ToastParameters`1 0%
Microsoft.FluentUI.AspNetCore.Components.ToastResult 0% 0%
Microsoft.FluentUI.AspNetCore.Components.ToastService 0% 0%
Microsoft.FluentUI.AspNetCore.Components.TreeChangeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TreeViewItem 100%
Microsoft.FluentUI.AspNetCore.Components.TreeViewItemExpandedEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.UploadedFileDetails 0%
Microsoft.FluentUI.AspNetCore.Components.Utilities.CssBuilder 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.InlineStyleBuilder 96.4% 87.5%
Microsoft.FluentUI.AspNetCore.Components.Utilities.InternalDebounce.Debounc
eAction
52.3% 18.7%
Microsoft.FluentUI.AspNetCore.Components.Utilities.InternalDebounce.Debounc
eTask
0% 0%
Microsoft.FluentUI.AspNetCore.Components.Utilities.InternalDebounce.Dispatc
herTimerExtensions
82.9% 68.7%
Microsoft.FluentUI.AspNetCore.Components.Utilities.JSModule 0% 0%
Microsoft.FluentUI.AspNetCore.Components.Utilities.RangeOf`1 96.7% 94.4%
Microsoft.FluentUI.AspNetCore.Components.Utilities.Splitter 82.8% 81.8%
Microsoft.FluentUI.AspNetCore.Components.Utilities.StyleBuilder 100% 91.6%
Microsoft.FluentUI.AspNetCore.Components.ZIndex 100%
System.Text.RegularExpressions.Generated 76.4% 53.1%

@MarvinKlein1508
Copy link
Collaborator

At least my provided test code doesn't seem to crash when we are doing it this way.

@vnbaaij
Copy link
Collaborator Author

vnbaaij commented Oct 22, 2025

Yeah, I think this solution is in line with what @Tyme-Bleyaert meant.

@MarvinKlein1508
Copy link
Collaborator

@vnbaaij we should probably move the disposed check within OnAfterRenderAsync right to the beginning. Otherwise the component will import the modules again. Line 221 to 223. This would also explain why dotNetReference is not null - even after I set it to null in DisposeAsync in a previous try.

We should probably do

if( _disposed)
{
return;
}

right in the beginning and remove it from the 2 if statements

@MarvinKlein1508
Copy link
Collaborator

nevermind. I just tried it when it's on top. This gets the error right back to me.

@vnbaaij
Copy link
Collaborator Author

vnbaaij commented Oct 22, 2025

I change the IJSObjectReferences to be non nullable again. Then in line 244 and 251 we only need to check for the !_disposed (besides the _reinitializeEventListeners in 251) . Makes it a lot simpler, I think.

- Undo nullable for js object references
@MarvinKlein1508
Copy link
Collaborator

Sorry wrong button. Should we also move

_dotNetHelper = DotNetObjectReference.Create(this);

into the constructor?

@vnbaaij
Copy link
Collaborator Author

vnbaaij commented Oct 22, 2025

Sorry wrong button. Should we also move

_dotNetHelper = DotNetObjectReference.Create(this);

into the constructor?

No, we always do that in OnAfterRenderAsync

@MarvinKlein1508
Copy link
Collaborator

@vnbaaij you are right. I was thinking wrong here. It wouldn't make a difference anyways since the method is only run on firstRender.

@MarvinKlein1508
Copy link
Collaborator

MarvinKlein1508 commented Oct 22, 2025

@vnbaaij
We need to expand the checks for the other two calls as well

await _jsModule.InvokeVoidAsync("addEventLeftClick", Anchor, _dotNetHelper);
await _jsModule.InvokeVoidAsync("addEventRightClick", Anchor, _dotNetHelper);

I tried my demo now in WebAssembly and it seems like the disposing here is a bit faster which triggers the exception earlier.
Otherwise it seems to be working.

@vnbaaij vnbaaij enabled auto-merge (squash) October 23, 2025 11:51
@vnbaaij vnbaaij merged commit 12e8dbb into dev Oct 23, 2025
3 checks passed
@vnbaaij vnbaaij deleted the users/vnbaaij/fix-issue-#4248 branch October 23, 2025 11:51
@MarvinKlein1508
Copy link
Collaborator

I have upgraded my project to the latest v4 preview release and I can confirm that this seems to be working now! :) No more crashes for me :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants