2

如何将 Blazored.LocalStorage (v2.1.6) 注入 blazor webassembly 服务 (3.2.0)?

这是我们尝试过的。尝试等待 LocalStorage.GetItemAsync 时出现空错误。

App.razor

@using Blazored.LocalStorage

程序.cs

builder.Services.AddBlazoredLocalStorage();
builder.Services.AddSingleton<Services.UserService>();

服务/用户服务.cs

namespace Test.Client.Services
{
    public class UserService
    {
        [Inject]
        private ILocalStorageService LocalStorage;
        private readonly HttpClient Http;

        public UserService(HttpClient _http)
        {
            Http = _http;
        }

        public async void LoginCallback()
        {
            string tkn = await LocalStorage.GetItemAsync<string>("tkn"); //Object null error here
        }
    }
}

编辑解决方案:首先,重新启动 Visual Studio,因为它正在持有某些东西,并且在我这样做之前不会对任何东西起作用。然后正如标记的答案所示,DI就像这样:

        private ILocalStorageService LocalStorage;
        private readonly HttpClient Http;

        public UserService(HttpClient _http, ILocalStorageService _localStorage)
        {
            Http = _http;
            LocalStorage = _localStorage;
        }
4

2 回答 2

0

我遇到了同样的问题并尝试重新启动我的 Visual Studio 以及我的计算机,两者都没有帮助,但后来发现这个有点相关的帖子: https ://github.com/dotnet/aspnetcore/issues/10143

显然,如果在函数中获取数据,我们需要检查 null OnInitializedAsync,就像在 FetchData.razor 示例中一样:

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
于 2020-07-09T18:57:13.980 回答
0

您必须先注入使用@inject <IService> <serviceInstanceName>

例子:

@using Blazored.SessionStorage
@inject ISessionStorageService sessionStorageService
...
@code
{
     var eml = sessionStorage.sessionStorageService.GetItemAsync<string>("emailAddress");
}

编辑:对不起,我误解了。以上是将会话存储注入剃须刀页面。如果您想注入一个类,请执行以下操作:

public class SomeClass
{
    private ISessionStorageService _sessionStorageService;
        

    // inject in the class constructor
    public SomeClass(ISessionStorageService sessionStorageService)
    {
        _sessionStorageService = sessionStorageService;
    }
}

这是在您已经完成的 Program.cs(在客户端)中注册服务的基础之上。

于 2020-07-07T23:59:41.730 回答