在 .NET 中创建应用程序 (8) MAUI BLAZOR HYBRID
该作品在 Android、Windows 和 iOS 上初始化。但是,数据仅在 Windows 和 Android 上检索和显示。 iOS平台不获取数据。它显示没有数据的页面并且不会重新加载它(显然无论如何都不会获取数据)。我设置了一个断点,它没有执行或到达以下代码行:
SharedData.SharedDataBundle = Global.DataBundleCollelction;
问题
观察结果是,下面的异步调用在 iOS 平台上不受尊重。 Windows 和 Android 会等待异步调用完成并继续处理数据。
不知道如何修复它,我尝试了很多调用它的方法,但 async-await Task.Run() 或 Task.WhenAll() 似乎不适用于 iOS。
启动代码
App.Xaml.cs中的代码如下:
public partial class App : Application
{
[Inject] SharedDataService sharedDataService { get; set; }
public App()
{
InitializeComponent();
sharedDataService = new SharedDataService();
var tasks = new List<Task>
{
Task.Run(async () =>
{
Global.DataBundleCollelction = await sharedDataService.UpdateSharedWeatherData(new List<int> { 1, 2, 4, 25, 26, 91 });
SharedData.SharedDataBundle = Global.DataBundleCollelction;
}),
Task.Run(async () =>
{
var bundle = Global.DataBundleCollelction;
var weatherSettingsService = new WeatherSettingsService(bundle);
var weatherSettings = await weatherSettingsService.LoadSettingsAsync();
})
};
Task.WhenAll(tasks).Wait();
MainPage = new MainPage();
}
}
请指导我我错过了什么?
更新:
我使用以下方法从 /Resources/Raw/MyJson.json (MauiAsset) 读取 JSON 文件
public async Task<ObservableCollection<T>> ReadJsonDataAsync<T>(string jsonDataFileName)
{
ObservableCollection<T>? genericTypeList = new();
var isExist = await FileSystem.AppPackageFileExistsAsync(jsonDataFileName);
if (isExist)
{
var stream = await FileSystem.Current.OpenAppPackageFileAsync(jsonDataFileName);
var reader = new StreamReader(stream);
var contents = await reader.ReadToEndAsync();
genericTypeList = JsonSerializer.Deserialize<ObservableCollection<T>>(contents);
}
return genericTypeList!;
}
观察/回答
上述函数将 JSON 文件读取为 MauiAsset。该文件路径被指定为“Resources/Raw/MyJsonFile.json” - 该路径适用于 Android 和 Windows,但 iOS 不喜欢它。
现在可以了,(@Alexandar May - MSFT)在下面的评论中分享的链接引导我找到了解决方案。
这是在 Github 上跟踪的一个已知问题:AppPackageFileExistsAsync 无法在具有 MAUI 资产的链接文件上工作#12635。
要修复此问题,您可以在
csproj
文件中编写资产链接,例如:
<MauiAsset Include="..\Resources\MyJsonFile.json">
<Link Condition=" $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) != 'android' ">Resources\Raw\MyJsonFile.json</Link>
<Link Condition=" $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android' ">Raw\MyJsonFile.json</Link>
</MauiAsset>
然后你可以像这样读取文件:
var isExist = await FileSystem.Current.AppPackageFileExistsAsync("Raw/MyJsonFile.json");