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

MAUI Shell.SearchHandler在iOS模拟器运行时崩溃的解决方法

问题解决思路及方案

核心原因分析

iOS模拟器崩溃的直接原因是StudentSearchHandler的Students属性为null,触发Students.Where()时抛出空引用异常;而OnQueryChanged未执行,是因为iOS端SearchHandler的绑定时机、静态属性绑定兼容性问题,导致属性未正确赋值就触发了查询逻辑。

具体解决方案

方案1:修复静态集合的初始化逻辑

将静态集合的数据填充移到静态构造函数中,确保类加载时就完成数据初始化,无需依赖ViewModel实例化:

public class StudentListViewModel
{
    public static List<StudentModel> Students { get; private set; }

    // 静态构造函数:类加载时自动执行
    static StudentListViewModel()
    {
        Students = new List<StudentModel>
        {
            new StudentModel { Name = "asd", Email = "asd@123.com" },
            new StudentModel { Name = "qwe", Email = "qwe@123.com" },
            new StudentModel { Name = "ert", Email = "rty@123.com" }
        };
    }

    public StudentListViewModel()
    {
        // 原实例构造函数的Add代码可删除
    }
}

方案2:添加空值防护逻辑

在OnQueryChanged中增加多层空值检查,即使绑定失败也不会崩溃:

protected override void OnQueryChanged(string oldValue, string newValue)
{
    base.OnQueryChanged(oldValue, newValue);

    if (string.IsNullOrWhiteSpace(newValue))
    {
        ItemsSource = null;
        return;
    }

    // 检查Students集合是否为null
    if (Students == null)
    {
        ItemsSource = null;
        return;
    }

    // 检查Student.Name是否为null,避免ToLower()空引用
    ItemsSource = Students.Where(student => 
        !string.IsNullOrWhiteSpace(student.Name) &&
        student.Name.ToLower().Contains(newValue.ToLower())).ToList();
}

方案3:改用实例属性绑定(推荐)

放弃x:Static绑定,改用MVVM标准的实例属性绑定,提升iOS端兼容性:

  1. 修改ViewModel为实例属性:
public class StudentListViewModel
{
    public List<StudentModel> Students { get; private set; }

    public StudentListViewModel()
    {
        Students = new List<StudentModel>
        {
            new StudentModel { Name = "asd", Email = "asd@123.com" },
            new StudentModel { Name = "qwe", Email = "qwe@123.com" },
            new StudentModel { Name = "ert", Email = "rty@123.com" }
        };
    }
}
  1. 修改XAML绑定:
<ContentPage.BindingContext>
    <vm:StudentListViewModel />
</ContentPage.BindingContext>

<Shell.SearchHandler>
    <searchHandlers:StudentSearchHandler
        DisplayMemberName="Name"
        Students="{Binding Students}">
    </searchHandlers:StudentSearchHandler>
</Shell.SearchHandler>

额外建议

检查你的Xamarin.Forms版本,若版本较旧,升级到最新稳定版可解决iOS SearchHandler的已知兼容性bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:20:18