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

Xamarin Forms中点击ListView触发页面重复Push问题求助

Xamarin Forms ListView点击导航重复Push页面问题解决

问题描述

我是Xamarin Forms新手,应用内有个收藏页面列表作为快捷入口。点击ListView条目导航时,出现页面重复Push的情况:第一次点击Push一次页面,返回后第二次点击会Push两次,需要按两次返回键才能回到原页面。

相关代码

private async void favPageList_ItemTapped(object sender, ItemTappedEventArgs e)
{
    var mpage = e.Item as FlyoutItemPage;
    if (mpage != null)
    {
        var yetkiList = await serviceManager.getKullaniciYetkiList(kullaniciKodu, myDBName);
        foreach (var item in yetkiList)
        {
            userAuthorities.Add(item);
        }
        if (mpage.Title == "Anasayfa" || mpage.Title == "Çıkış")
        {
            await Navigation.PushAsync(new NavigationPage((Page)Activator.CreateInstance(mpage.TargetPage)));
         
        }
        else
        {
            for (int i = 0; i < userAuthorities.Count; i++)
            {
                if (mpage.Title == userAuthorities[i].BASLIK)
                {
                    Console.WriteLine($"fpage title: {mpage.Title} userAuth title: {userAuthorities[i].BASLIK}");
                    if (userAuthorities[i].VIEW == "E")
                    {
                        await Navigation.PushAsync(new NavigationPage((Page)Activator.CreateInstance(mpage.TargetPage)));
                    }
                    else
                    {
                        UserDialogs.Instance.Alert(new AlertConfig
                        {
                            Message = "Giriş yetkiniz bulunmuyor!",
                            OkText = "Tamam"
                        });
                    }
                }
            }
        }
    }
}

问题原因

  1. userAuthorities集合未清空:每次点击条目都会追加新的权限数据到集合中,导致集合内条目数量随点击次数递增。
  2. 循环未及时终止:权限匹配的for循环中,只要找到符合条件的条目就执行Push操作,若集合中有多个相同标题的权限,会重复Push;且随着集合条目增多,后续点击时Push次数也会增加。

修复方案

1. 清空权限集合再添加新数据

在获取权限列表前,先清空userAuthorities,避免数据累加:

userAuthorities.Clear(); // 新增:清空旧数据
var yetkiList = await serviceManager.getKullaniciYetkiList(kullaniciKodu, myDBName);
foreach (var item in yetkiList)
{
    userAuthorities.Add(item);
}

2. 匹配权限后立即跳出循环

找到对应权限并完成导航/提示后,终止循环,避免重复执行操作:

for (int i = 0; i < userAuthorities.Count; i++)
{
    if (mpage.Title == userAuthorities[i].BASLIK)
    {
        Console.WriteLine($"fpage title: {mpage.Title} userAuth title: {userAuthorities[i].BASLIK}");
        if (userAuthorities[i].VIEW == "E")
        {
            await Navigation.PushAsync(new NavigationPage((Page)Activator.CreateInstance(mpage.TargetPage)));
        }
        else
        {
            UserDialogs.Instance.Alert(new AlertConfig
            {
                Message = "Giriş yetkiniz bulunmuyor!",
                OkText = "Tamam"
            });
        }
        break; // 新增:跳出循环,避免重复操作
    }
}

3. 优化导航层级(可选)

如果当前页面已经处于NavigationPage容器中,直接Push目标页面即可,无需嵌套创建新的NavigationPage,避免导航栏重复:

// 替换原Push代码
await Navigation.PushAsync((Page)Activator.CreateInstance(mpage.TargetPage));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:32:51