如何在 .cs class 而不是 Blazor 页面中使用 Blazored.LocalStorage?

How to consume Blazored.LocalStorage inside a .cs class instead a Blazor page?

我看到很多以这种方式工作的例子,但这对我不起作用。有帮助吗?

Program.cs

...
using Blazored.LocalStorage;
using TestFullPage.Classes;

namespace TestFullPage
{
public class Program
{
    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("#app");
        builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
        builder.Services.AddBlazoredLocalStorage();
        builder.Services.AddSingleton<Session>();
        await builder.Build().RunAsync();
    }
}
}

Session.cs

...
using Microsoft.AspNetCore.Components;
using Blazored.LocalStorage;

namespace TestFullPage.Classes
{
public class Session
{
    [Inject]
    public ILocalStorageService LocalStorage { get; set; }
    public void updateLocalStorage()
    {
        LocalStorage.SetItemAsync("test", "123");
    }
}
}

Index.razor

@page "/"
@inject Session sesssion

<button @onclick="() =>Write()">Write to LocalStorage</button>

@code {
public void Write() {
    sesssion.updateLocalStorage();
}

}

未处理的异常呈现组件:未将对象引用设置为对象的实例。 System.NullReferenceException: 对象引用未设置到实例 ---> LocalStorage.SetItemAsync("test", "123");

您正在使用 class 'Session' 作为 'component class' 但事实并非如此 用这个替换它,它应该可以工作:

 public class Session
    {
        protected readonly ILocalStorageService _localStorage;

        public Session(ILocalStorageService LocalStorage)
        {
            _localStorage = LocalStorage; 

        }

        public void updateLocalStorage()
        {
            _localStorage.SetItemAsync("test", "123");
        }
    }

您需要将 'Session' 从单例更改为 scooped,请参考此线程: