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

Xamarin.Forms安卓端MVVM调用REST API加载ListView报空引用异常

问题根因

抛出NullReferenceException的直接原因是_rest字段为null:你在ViewModel里通过DependencyService.Get<IMachineService>()获取服务实例,但当前出问题的项目没有完成IMachineService和实现类MachineService的依赖注册,所以DependencyService返回了null,后续执行await _rest.GetMachines()时就触发了空引用错误。
相同代码在其他项目能正常运行,本质是其他项目里已经做了对应依赖注册,当前项目遗漏了这一步配置。
日志里输出的程序集加载失败、硬件加速相关内容都是Xamarin Android调试的常规输出,和本次空引用无关。

修复方法
  • 第一步:给MachineService添加Xamarin依赖注册特性,保证DependencyService能扫描到实现类。在MachineService所在的文件顶部,命名空间声明外添加如下代码:
[assembly: Xamarin.Forms.Dependency(typeof(MachineService))]

添加后服务类的结构参考如下:

using Xamarin.Forms;
// 注册特性放在命名空间外
[assembly: Dependency(typeof(MachineService))]

namespace YourAppNamespace.Services
{
    public class MachineService : IMachineService
    {
        public  string Base_url = "https://169.254.178.79:45455/api/";

        public async Task<ObservableCollection<Machine>> GetMachines()
        {
            string url = Base_url + "machines";
            HttpClient client = new HttpClient();
            HttpResponseMessage responseMessage = await client.GetAsync(url);

            if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK)
            {
                var result = await responseMessage.Content.ReadAsStringAsync();
                var json = JsonConvert.DeserializeObject<ObservableCollection<Machine>>(result);
                return json;
            }
            return null;
        }
    }
}
  • 额外检查项:
    • 确认Android项目清单文件AndroidManifest.xml中已经声明INTERNET权限,否则本地HTTPS接口请求会失败(该问题不会触发本次空引用,但注册完依赖后如果接口不通可以排查这一项)
    • 建议不要每次调用接口都新建HttpClient实例,全局复用一个静态实例可以避免套接字耗尽问题,属于后续可优化的点
    • 尽量避免在构造函数里直接调用async void方法,可以把数据加载逻辑移到页面的OnAppearing生命周期方法中调用,方便异常捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:42:28