MAUI Blazor组件异步依赖注入及数据加载顺序问题求助
问题解决步骤
1. 修正异步方法的返回类型与调用方式
Blazor组件生命周期方法支持async Task,但禁止使用async void(仅事件处理场景例外),否则框架无法追踪异步操作完成时机,导致UI不及时更新。
将
OnInitialized替换为OnInitializedAsync,并异步等待loadLotes:protected override async Task OnInitializedAsync() { await loadLotes(); int x = 1; }将
loadLotes的返回类型从async void改为async Task:private async Task loadLotes() { var tmpLstLotesFiltrada = await lotesManager.getLoteByIdPropriedade(idPropriedade: "-Mfp3q1ma0ZkFsIUXqyE"); lstLotesFiltrada = tmpLstLotesFiltrada; // 手动通知组件状态变更,确保子组件刷新数据 StateHasChanged(); }
2. 修正依赖注入的错误赋值
[Inject]属性标记的字段不需要手动实例化,框架会自动注入实现类,手动赋值会覆盖注入实例:
[Inject] private ILotesManager lotesManager { get; set; } = null!; // 用null!消除空引用警告
3. 修正Razor语法错误
子组件参数传递:需要用
@符号绑定变量,否则会传递字符串字面量而非变量值:<LoteCard @lstLotesFiltrada="lstLotesFiltrada" @visible="isVisible"/>LoteCard组件内的Razor语法修正:
- 变量输出需加
@符号; - 条件判断需用
@if语法:<h3>@l.numLote:@l.pesoLote</h3> ... @if (visible){ <p> this is visible</p> }
- 变量输出需加
4. 可选:添加加载状态提示
如果异步请求耗时较长,可在数据加载完成前显示加载提示,提升用户体验:
@if (lstLotesFiltrada == null || !lstLotesFiltrada.Any()) { <p>加载中...</p> } else { <LoteCard @lstLotesFiltrada="lstLotesFiltrada" @visible="isVisible"/> }
内容的提问来源于stack exchange,提问作者Ilian Felinto
相关产品推荐
相关产品推荐

