Xamarin.Forms页面打开时ViewModel方法被调用4次的原因排查
问题分析:ViewModel构造函数重复调用导致重复API请求
导航至DepoAktarımBarkodPage页面时,对应的DepoAktarımBarkodPageViewModel构造函数被执行4次,导致其中的GetDepoDetayForStokHareket()等方法重复发起4次API调用,引发业务异常。控制台重复输出4次belge no : ,证实构造函数被实例化了4次。
相关ViewModel代码
public class DepoAktarımBarkodPageViewModel : INotifyPropertyChanged { public DepoAktarımBarkodPageViewModel() { AddBarkodToMyList = new Command<string>(addBarkod); //BarkodgetirCommand = new Command(barkodGetir); StokPopUpOpenCommand = new Command(stokPopUpOpen); EvrakLineDeleteCommand = new Command(satirSil); ChangeTempMiktarCommand = new Command<string>(changeMyTempMiktar); ScannerOpenCommand = new Command(scannerOpen); GetResultCommand = new Command(async (r) => await GetScannedAsync(r)); SelectTempBarkod = new Command<string>(SelectMyTempBarkod); SelectGRaf = new Command<string>(changeTempGRaf); SelectCRaf = new Command<string>(changeTempCRaf); OzetListeDoldur = new Command(OzetPageListDoldur); SerbestMikOpenCommand = new Command(serbestMikPopUpOpen); GetDepoDetayForStokHareket(); changeMyTempMiktar(""); fillRafLists(); detectYeniStok(); Console.WriteLine($"belge no : {belgeNO}"); } }
控制台输出
belge no : belge no : belge no : belge no :
可能成因
- 导航逻辑重复触发:导航至该页面的代码被多次执行,比如按钮点击事件重复绑定、导航命令被多次订阅,每次导航都会新建ViewModel实例。
- ViewModel实例化方式错误:
- XAML中重复设置
DataContext(比如同时在Page标签和后台代码OnNavigatedTo方法中赋值); - 依赖注入容器配置错误,将ViewModel注册为瞬态但被多次解析。
- XAML中重复设置
- 页面生命周期事件重复触发:
OnNavigatedTo等生命周期方法因页面栈操作异常、导航模式问题被触发4次,且每次触发都新建ViewModel实例。 - XAML资源或绑定问题:XAML中多次引用该ViewModel作为资源,或者绑定路径错误导致框架自动多次创建实例。
- 路由配置异常:路由规则设置不当,导致同一页面被多次匹配加载,进而重复实例化ViewModel。
内容的提问来源于stack exchange,提问作者Mert Altiparmak
相关产品推荐
相关产品推荐

