Uno Platform调用ApplicationData.Current.LocalFolder时对象状态无效问题排查
问题
我拥有一个Uno Platform项目,其TargetFrameworks配置为net7.0-windows10.0.1901;net7.0。我尝试使用Windows.Storage命名空间下的API实现跨平台本地存储,代码如下:
public static async Task<T?> RetrieveDataAsync<T>(string filename) { if (!string.IsNullOrEmpty(filename)) { try { StorageFolder localFolder = ApplicationData.Current.LocalFolder; StorageFile storageFile = await localFolder.GetFileAsync($"{filename}.json"); string serializedData = await FileIO.ReadTextAsync(storageFile); return JsonSerializer.Deserialize<T>(serializedData); } catch (Exception ex) { string msg = ex.Message; } } return default(T); }
但针对Windows平台构建时,在StorageFolder localFolder = ApplicationData.Current.LocalFolder;行出现错误提示“Operation is not valid due to the current state of the object”。Uno官方文档显示该API支持全平台,请问错误成因是什么?
错误成因分析
- ApplicationData初始化时机错误:在Windows平台的WinUI 3/Desktop场景中,
ApplicationData.Current必须在UI线程且应用完成初始化后才能访问。如果代码在应用启动早期(比如App构造函数、无UI上下文的后台线程)调用,就会触发状态无效错误。 - TargetFramework配置优先级冲突:项目同时指定
net7.0和net7.0-windows10.0.1901,Windows编译时可能优先使用通用net7.0的兼容实现而非WinRT原生API,导致ApplicationData无法正确获取。建议调整TargetFramework顺序,将Windows特定框架放在首位,或通过条件编译单独处理Windows平台逻辑。 - 应用存储上下文异常:若项目采用非MSIX打包的桌面exe形式,或是意外禁用了本地文件访问权限,
ApplicationData对应的沙箱存储环境无法正常加载,进而引发错误。 - 静态方法调用时机不当:你的方法是静态方法,若在UI组件未完成初始化前调用(比如页面未加载时),
ApplicationData的上下文尚未建立,就会抛出该错误。建议将数据读取逻辑延后到页面加载完成事件(如OnNavigatedTo)中执行。
内容的提问来源于stack exchange,提问作者Robotuner
相关产品推荐
相关产品推荐

