You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移Xamarin至.NET MAUI后二次启动因FFImageLoading.Compat崩溃

迁移Xamarin到.NET MAUI后二次启动因FFImageLoading.Compat崩溃的问题解决

问题详情

  • 应用从Xamarin迁移至.NET MAUI后,首次启动运行正常,但关闭后再次启动时抛出异常
  • 当前依赖FFImageLoading.Compat.Maui(版本3.0.0.0)
  • 安卓端异常触发于MainActivity.cs的base.OnCreate(_Bundle)方法;iOS端在AppDelegate.cs处崩溃
  • 异常栈追踪指向FFImageLoading.Maui.CachedImage.SetupOnBeforeImageLoading方法,具体栈信息如下:
at FFImageLoading.Maui.CachedImage.SetupOnBeforeImageLoading(TaskParameter& imageLoader, IImageSourceBinding source, IImageSourceBinding loadingPlaceholderSource, IImageSourceBinding errorPlaceholderSource)
   at FFImageLoading.Maui.Platform.CachedImageHandler.UpdateBitmap(CachedImageView imageView, CachedImage image, CachedImage previousImage)
   at FFImageLoading.Maui.Platform.CachedImageHandler.ConnectHandler(CachedImageView platformView)
   at Microsoft.Maui.Handlers.ViewHandler`2[[FFImageLoading.Maui.CachedImage, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null],[FFImageLoading.Maui.Platform.CachedImageView, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null]].OnConnectHandler(View platformView) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandlerOfT.cs:line 76
   at Microsoft.Maui.Handlers.ViewHandler.OnConnectHandler(Object platformView) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandler.cs:line 151
   at Microsoft.Maui.Handlers.ElementHandler.ConnectHandler(Object platformView) in D:\a\_work\1\s\src\Core\src\Handlers\Element\ElementHandler.cs:line 106
   at Microsoft.Maui.Handlers.ElementHandler.SetVirtualView(IElement view) in D:\a\_work\1\s\src\Core\src\Handlers\Element\ElementHandler.cs:line 64
   at Microsoft.Maui.Handlers.ViewHandler.SetVirtualView(IElement element) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandler.cs:line 134
   at Microsoft.Maui.Handlers.ViewHandler`2[[FFImageLoading.Maui.CachedImage, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null],[FFImageLoading.Maui.Platform.CachedImageView, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null]].SetVirtualView(IView view) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandlerOfT.cs:line 53
   at Microsoft.Maui.Handlers.ViewHandler`2[[FFImageLoading.Maui.CachedImage, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null],[FFImageLoading.Maui.Platform.CachedImageView, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null]].SetVirtualView(IElement view) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandlerOfT.cs:line 56
   at Microsoft.Maui.Controls.Element.SetHandler(IElementHandler newHandler) in D:\a\_work\1\s\src\Controls\src\Core\HandlerImpl\Element\Element.Impl.cs:line 69
   at Microsoft.Maui.Controls.Element.set_Handler(IElementHandler value) in D:\a\_work\1\s\src\Controls\src\Core\HandlerImpl\Element\Element.Impl.cs:line 19
   at Microsoft.Maui.Controls.VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value) in D:\a\_work\1\s\src\Controls\src\Core\HandlerImpl\VisualElement\VisualElement.Impl.cs:line 305
   at Microsoft.Maui.Platform.ElementExtensions.ToHandler(IElement view, IMauiContext context) in D:\a\_work\1\s\src\Core\src\Platform\ElementExtensions.cs:line 96

解决方案

1. 清理应用退出时的FFImageLoading缓存

在App.xaml.cs的OnSleep或OnStop方法中添加缓存清理逻辑,避免二次启动时缓存残留导致异常:

protected override void OnSleep()
{
    base.OnSleep();
    // 清理所有类型缓存
    FFImageLoading.ImageService.Instance.InvalidateCacheAsync(FFImageLoading.Cache.CacheType.All).Wait();
    FFImageLoading.ImageService.Instance.ClearMemoryCache();
    FFImageLoading.ImageService.Instance.ClearDiskCacheAsync().Wait();
}

2. 修正FFImageLoading服务初始化配置

在MauiProgram.cs中确保服务正确注册并替换MAUI默认图像处理器:

var builder = MauiApp.CreateBuilder();
builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>
    {
        fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
    });

// 注册FFImageLoading服务
builder.Services.AddFFImageLoading(options =>
{
    options.DiskCacheDuration = TimeSpan.FromDays(7);
    options.MemoryCacheSize = 1024 * 1024 * 50; // 50MB内存缓存
});

// 替换原生Image控件的Handler为FFImageLoading实现
builder.ConfigureMauiHandlers(handlers =>
{
    handlers.AddHandler<Microsoft.Maui.Controls.Image, FFImageLoading.Maui.Platform.CachedImageHandler>();
});

return builder.Build();

3. 检查并修复CachedImage绑定

确保XAML中CachedImage的Source绑定存在 fallback 处理,避免空值触发异常:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:ffimageloading="clr-namespace:FFImageLoading.Maui;assembly=FFImageLoading.Compat.Maui"
             x:Class="YourApp.Views.YourPage">

    <ffimageloading:CachedImage
        Source="{Binding ItemImageUrl, FallbackValue='default_placeholder.png'}"
        LoadingPlaceholder="loading_placeholder.png"
        ErrorPlaceholder="error_placeholder.png"
        HeightRequest="150"
        WidthRequest="150" />
</ContentPage>

4. 升级FFImageLoading.Compat.Maui版本

当前使用的3.0.0.0版本存在已知的二次启动缓存问题,通过NuGet包管理器升级到最新兼容版本,可修复部分底层bug。

5. 替换为MAUI原生Image控件(备选方案)

若上述方法无效,可逐步替换CachedImage为MAUI原生Image控件,配合MAUI自带的图像缓存机制:

// 在MauiProgram.cs中配置原生图像缓存
builder.Services.Configure<Microsoft.Maui.Platform.ImageLoaderConfiguration>(options =>
{
    options.CacheDuration = TimeSpan.FromDays(7);
    options.MaxCacheSize = 1024 * 1024 * 50;
});

内容的提问来源于stack exchange,提问作者saif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:26:06