{"record":{"id":"a85f0a7e31300dcb","repo":"babalae/better-genshin-impact","slug":"error-a85f0a","errorCode":null,"errorMessage":"内部视图模型对象为空","messagePattern":"内部视图模型对象为空","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/Core/Script/Dependence/Genshin.cs","lineNumber":462,"sourceCode":"    /// <summary>\n    /// 返回主界面\n    /// </summary>\n    /// <returns></returns>\n    public async Task ReturnMainUi()\n    {\n        await new ReturnMainUiTask().Start(CancellationContext.Instance.Cts.Token);\n    }\n\n    /// <summary>\n    /// 钓鱼\n    /// </summary>\n    /// <returns></returns>\n    public async Task AutoFishing(int fishingTimePolicy = 0)\n    {\n        var taskSettingsPageViewModel = App.GetService<TaskSettingsPageViewModel>();\n        if (taskSettingsPageViewModel == null)\n        {\n            throw new ArgumentNullException(nameof(taskSettingsPageViewModel), \"内部视图模型对象为空\");\n        }\n\n        var param = AutoFishingTaskParam.BuildFromConfig(TaskContext.Instance().Config.AutoFishingConfig, taskSettingsPageViewModel.SaveScreenshotOnKeyTick);\n        param.FishingTimePolicy = (FishingTimePolicy)fishingTimePolicy;\n        await new AutoFishingTask(param).Start(CancellationContext.Instance.Cts.Token);\n    }\n\n    /// <summary>\n    /// 重新登录原神\n    /// </summary>\n    /// <returns></returns>\n    public async Task Relogin()\n    {\n        await new ExitAndReloginJob().Start(CancellationContext.Instance.Cts.Token);\n    }\n    \n    /// <summary>\n    /// 进出千星奇域","sourceCodeStart":444,"sourceCodeEnd":480,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/Core/Script/Dependence/Genshin.cs#L444-L480","documentation":"Thrown as ArgumentNullException when App.GetService<TaskSettingsPageViewModel>() returns null inside AutoFishing. This means the WPF dependency-injection container either has not registered TaskSettingsPageViewModel or is not available in the current execution context (e.g., running outside the main application lifecycle).","triggerScenarios":"Calling genshin.AutoFishing() when the application's ServiceProvider has not been initialized (headless test, plugin context, or before App startup completes). Also possible if TaskSettingsPageViewModel was removed from DI registration or the service scope is disposed.","commonSituations":"Running a script during application startup before the DI container is fully built. Unit testing AutoFishing without mocking App.GetService. A refactor that accidentally removed the TaskSettingsPageViewModel registration from App.xaml.cs.","solutions":["Ensure AutoFishing is only called after the WPF application has fully initialized and the ServiceProvider is available.","Verify TaskSettingsPageViewModel is registered in App.xaml.cs services.AddView or services.AddTransient.","If running in a non-WPF context, inject the ViewModel or the required config value directly instead of resolving from App.GetService.","Check that the service provider hasn't been disposed (e.g., during shutdown) before calling."],"exampleFix":"// before\npublic async Task AutoFishing(int fishingTimePolicy = 0)\n{\n    var vm = App.GetService<TaskSettingsPageViewModel>();\n    if (vm == null)\n        throw new ArgumentNullException(nameof(vm), \"内部视图模型对象为空\");\n    // ...\n}\n\n// after — fail with a user-actionable message and early-return instead of null-deref\npublic async Task AutoFishing(int fishingTimePolicy = 0)\n{\n    var vm = App.GetService<TaskSettingsPageViewModel>()\n        ?? throw new InvalidOperationException(\"AutoFishing 不可用：任务设置页面未初始化，请确保调度器已加载完毕。\");\n    // ...\n}","handlingStrategy":"try-catch","validationCode":"// Check service availability before calling AutoFishing\nvar vm = App.GetService<TaskSettingsPageViewModel>();\nif (vm == null)\n{\n    _logger.LogError(\"TaskSettingsPageViewModel not available — AutoFishing requires full app initialization\");\n    return;\n}","typeGuard":null,"tryCatchPattern":"try\n{\n    await genshin.AutoFishing(fishingTimePolicy);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == \"taskSettingsPageViewModel\")\n{\n    _logger.LogError(\"AutoFishing unavailable: DI container not initialized. Ensure the app is fully started.\");\n}","preventionTips":["Only call AutoFishing after the WPF application and DI container are fully initialized.","Verify TaskSettingsPageViewModel is registered in App.xaml.cs services.","Avoid calling script-dependent methods during startup or shutdown sequences."],"tags":["dependency-injection","null-reference","wpf","viewmodel","fishing"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}