.NET MAUI从内部文件夹加载Lottie文件的问题求助
MAUI SkiaSharp加载本地Lottie JSON文件问题解决
问题根源
SkiaSharp.Extended.UI.Maui的SKFileLottieImageSource对本地文件路径的解析逻辑和Xamarin旧版Lottie库不同,直接传入绝对路径无法正确读取;另外异步操作时未切换到UI线程更新控件,也会导致加载失败。
可靠解决方案
方案1:异步读取JSON内容并通过SKJsonLottieImageSource加载
这是跨平台通用的最优方案,避免路径解析的平台差异:
if (File.Exists(imagePath)) { // 异步读取文件,避免阻塞UI线程 var jsonContent = await File.ReadAllTextAsync(imagePath); // 必须在UI线程更新控件 MainThread.BeginInvokeOnMainThread(() => { animation_view.Source = new SKJsonLottieImageSource { Json = jsonContent }; }); }
方案2:Android平台适配SKFileLottieImageSource路径
如果坚持使用文件路径加载,Android上需要转换为URI格式:
if (File.Exists(imagePath)) { var file = new Java.IO.File(imagePath); var fileUri = Android.Net.Uri.FromFile(file); MainThread.BeginInvokeOnMainThread(() => { animation_view.Source = new SKFileLottieImageSource { File = fileUri.ToString() }; }); }
额外优化建议
- 线程规范:所有UI控件的属性更新必须在UI线程执行,之前的5秒延迟能生效本质是巧合让线程调度完成,并非合理方案。
- iOS兼容:iOS本地文件路径规则和Android差异大,建议统一使用方案1跨平台加载,减少适配成本。
- 着色器错误修复:下拉刷新时出现的着色器编译错误,可在刷新开始时将
animation_view.Source设为null释放旧资源,刷新完成后再重新加载新的Lottie内容。
内容的提问来源于stack exchange,提问作者JSB
相关产品推荐
相关产品推荐

