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

Xamarin.Forms Android端导出页面数据到PDF报空引用异常求助

排查Xamarin.Forms中DependencyService.Get()的空引用异常

空引用异常直接指向DependencyService.Get<ISave>()返回了null,核心原因是DependencyService找不到ISave接口的Android平台实现类,按以下步骤逐一排查:

1. 检查Android实现类的注册特性

必须在Android项目的ISave实现类上方添加[assembly: Dependency(typeof(你的实现类名))]特性,确保DependencyService能识别到该实现。示例实现类:

[assembly: Dependency(typeof(SaveAndroid))]
namespace YourApp.Droid
{
    public class SaveAndroid : ISave
    {
        public string Save(string fileName, string contentType, MemoryStream fileStream)
        {
            // Android平台保存逻辑:比如写入下载目录
            var downloadPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
            var fullPath = Path.Combine(downloadPath, fileName);
            
            fileStream.Position = 0; // 重置流指针到起始位置
            using (var fileStreamWriter = new FileStream(fullPath, FileMode.Create))
            {
                fileStream.CopyTo(fileStreamWriter);
            }
            return $"文件已保存至:{fullPath}";
        }
    }
}

2. 验证接口与实现的匹配性

  • 确保Android实现类完全实现ISave接口:方法名、参数类型、返回值类型必须和接口定义一致。
  • 接口和实现类的访问修饰符为public,且实现类有无参构造函数。

3. 检查命名空间与程序集引用

  • ISave接口所在的类库必须被Android项目引用。
  • 接口和实现类的命名空间建议保持一致,避免DependencyService扫描不到。

4. 修正调用代码的两个问题

除了空引用,你的调用代码还有两处隐患:

private void PDFExport_Clicked(object sender, EventArgs e)
{
    DataGridPdfExportingController pdfExport = new DataGridPdfExportingController();
    MemoryStream stream = new MemoryStream();
    var exportToPdf = pdfExport.ExportToPdf(this.dataGrid, new DataGridPdfExportOption()
    {
        FitAllColumnsInOnePage = true,
    });
    exportToPdf.Save(stream);
    exportToPdf.Close(true);

    // 1. 重置流指针到起始位置,否则保存的文件是空的
    stream.Position = 0;
    // 2. 先判断服务是否获取成功,再调用方法
    var saveService = DependencyService.Get<ISave>();
    if (saveService != null)
    {
        saveService.Save("DataGrid.pdf", "application/pdf", stream);
    }
    else
    {
        // 可添加日志或用户提示
        Console.WriteLine("未找到ISave服务实现");
    }
}

5. 清理重建解决方案

编译缓存可能导致DependencyService无法识别新添加的实现类,执行以下操作:

  • 清理所有项目的bin/obj目录
  • 重新生成整个解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:32:24