我目前正在开发适用于 Android 和 iOS 的 MAUI 应用程序。将应用程序部署到 iOS 设备时 - 无论它是模拟器还是真实设备 - 我的应用程序中有一些内容页面,在导航到它们时会抛出以下错误:
谷歌搜索这个问题让我相信当您尝试异步填充或更新尚未绘制的视图时会发生错误。老实说,我确实尝试在页面的
Appearing
事件中加载数据,但我已经修复了这个问题。请看下面的示例。
这是一个名为 StocktakingView
的页面及其视图模型的示例,该页面将抛出错误:
<ContentPage xmlns=...>
<ContentPage.Behaviors>
<toolkit:EventToCommandBehavior EventName="Appearing" Command="{Binding AppearingCommand}" />
<toolkit:EventToCommandBehavior EventName="NavigatedFrom" Command="{Binding NavigatedFromCommand}" />
</ContentPage.Behaviors>
<ContentPage.ToolbarItems>
<ToolbarItem Command="{Binding CreateCommand}" IconImageSource="{FontImageSource FontFamily=MaterialSharp, Glyph={x:Static m:MaterialSharp.Add}, Color={AppThemeBinding Dark=White, Light=Black}}" />
</ContentPage.ToolbarItems>
<CollectionView ItemsSource="{Binding Stocktakings}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="model:Stocktaking">
<Grid ColumnDefinitions="*,*" Padding="10">
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding Source={RelativeSource AncestorType={x:Type vm:StocktakingViewModel}}, Path=TapCommand}" CommandParameter="{Binding .}" />
</Grid.GestureRecognizers>
<Label Grid.Column="0" Text="{Binding Name}" FontAttributes="Bold" />
<Label Grid.Column="1" Text="{Binding Status}" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</ContentPage>
这是视图模型:
[QueryProperty("Stocktakings_list", "stocktakings")]
public partial class StocktakingViewModel : BaseViewModel
{
private readonly IUserDialogs _userDialogs;
private readonly IGenericService<Stocktaking, StocktakingCreationInfo> _stocktakingService;
[ObservableProperty]
List<Stocktaking> stocktakings_list;
[ObservableProperty]
ObservableCollection<Stocktaking> stocktakings;
public StocktakingViewModel(IUserDialogs userDialogs, IGenericService<Stocktaking, StocktakingCreationInfo> stocktakingService)
{
_userDialogs = userDialogs;
_stocktakingService = stocktakingService;
}
[RelayCommand]
private void OnAppearing()
{
Stocktakings = new ObservableCollection<Stocktaking>(Stocktakings_list);
}
...
Stocktakings
是点击上一页中的图像时通过 HTTP 请求加载的对象列表。这发生在导航到 Stocktaking
页面之前。然后该列表作为
StocktakingView
的参数传递。
private async Task NavigateToStocktaking()
{
List<Stocktaking> stocktakings = await _stocktakingService.GetAll();
Dictionary<string, object> param = new Dictionary<string, object>
{
{ "stocktakings", stocktakings }
};
await Shell.Current.GoToAsync(nameof(StocktakingView), param);
}
我的应用程序中的其他页面也有集合视图,并且不会引发任何错误。在导航到页面之前,这些视图也会填充数据。这些页面和有问题的页面基本上没有区别,但它们不会抛出任何错误。我已经尝试过的:
IsSuccessStatusCode
为 false,我的服务会引发异常,这会导致您在屏幕截图中看到的异常。异常的措辞让我相信它与填充或绘制集合视图有关,并且使我没有注意到服务异常。由于我在调试 iOS 时无法设置任何断点,因此我从未有机会实际测试该服务,我只是假设它有效。 然而,这个问题与 MAUI 的 bug 无关。