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" }); } } } } } }
问题原因
userAuthorities集合未清空:每次点击条目都会追加新的权限数据到集合中,导致集合内条目数量随点击次数递增。- 循环未及时终止:权限匹配的
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
相关产品推荐
相关产品推荐

