@inject UserDataProvider UserDataProvider @implements IDisposable @if (state == null) {

loading...

} else { @ChildContent } @code{ private UserData state = null; [Parameter] public RenderFragment ChildContent { get; set; } protected override async Task OnInitializedAsync() { UserDataProvider.Changed += UserDataChanged; await Refresh(); } public void Dispose() { UserDataProvider.Changed -= UserDataChanged; } private async void UserDataChanged(object sender, EventArgs e) { await InvokeAsync(async () => { await Refresh(); StateHasChanged(); }); } private async Task Refresh() { state = await UserDataProvider.Get(); } }