如何在组件中异步代码 Blazor 依赖注入?

问题描述 投票:0回答:1

我开始研究 MAUI Blazor 以将 Android 中的一些应用程序迁移到 iOS。我在 Blazor 组件的依赖注入方面遇到了一些困难。

这是我创建的用于列出一些项目的卡片:

<h3>LoteCard</h3>

<div class="row">
    @foreach (Lote l in lstLotesFiltrada)
    {
        <div class="col-sm-4 p-2">
            <div class="lote-card">
                <div class="lote-card-header">
                    <h3>l.numLote:l.pesoLote</h3>
                </div>
                if (visible){
                    <p> this is visible</p>
                }
            </div>
        </div>
    }
</div>


@code {
    [Parameter]
    public bool visible { get; set; }

    [Parameter]
    public List<Lote> lstLotesFiltrada { get; set; } = new List<Lote>();

}

这是 CardComponent 的代码:


<LoteCard lstLotesFiltrada="lstLotesFiltrada" visible="isVisible"/>


@code {
    private bool isVisible = true;

    private List<Lote> lstLotesFiltrada = new List<Lote>();

    [Inject]
    private ILotesManager lotesManager { get; set; } = new LotesManager();

    protected override async void OnInitialized()
    {
        base.OnInitialized();

        loadLotes();

        int x = 1;

    }

    private async void loadLotes()
    {
        List<Lote> tmpLstLotesFiltrada = await lotesManager.getLoteByIdPropriedade(idPropriedade: "-Mfp3q1ma0ZkFsIUXqyE");

        lstLotesFiltrada = tmpLstLotesFiltrada;

    }

问题是,当我调用“loadLotes()”时,它会等待结果。但是,代码继续前进,forLoop 在带有空列表的 Card 上执行。之后“getLote...”方法返回包含项目的列表。

执行顺序为:

  1. 火力负载;
  2. “x=1”
  3. 卡上的ForLoop
  4. “lstLotesFiltrada = tmpLstLotesFiltrada”

我知道这与异步代码有关,但我很难找到解决方案。

请帮忙!谢谢!

async-await dependency-injection blazor maui-blazor
1个回答
0
投票

您的异步方法应该返回一个任务,并且您应该正确覆盖异步

OnInitializedAsync

protected override async Task OnInitializedAsync()
{
  await base.OnInitializedAsync();

  await loadLotes();

  int x = 1;
}

private async Task loadLotes()
{
  List<Lote> tmpLstLotesFiltrada = await 
    lotesManager.getLoteByIdPropriedade(idPropriedade: "-Mfp3q1ma0ZkFsIUXqyE");

  lstLotesFiltrada = tmpLstLotesFiltrada;
}

根据文档:

对于除事件处理程序之外不返回值的方法,您可以 应该返回一个任务,因为异步方法返回

void
等不及了。此类方法的任何调用者都必须继续 无需等待调用的异步方法完成即可完成。

https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/async-return-types#void-return-type

© www.soinside.com 2019 - 2024. All rights reserved.