Skip to content

Commit 96c2373

Browse files
committed
Code Quality: Fix NullReferenceException in ColumnShellPage
1 parent 2245c0a commit 96c2373

File tree

1 file changed

+74
-42
lines changed

1 file changed

+74
-42
lines changed

src/Files.App/Views/Shells/ColumnShellPage.xaml.cs

Lines changed: 74 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
4747
{
4848
base.OnNavigatedTo(eventArgs);
4949

50-
ColumnParams = eventArgs.Parameter as ColumnParam;
50+
ColumnParams = eventArgs?.Parameter as ColumnParam;
5151
if (ColumnParams?.IsLayoutSwitch ?? false)
5252
FilesystemViewModel_DirectoryInfoUpdated(this, EventArgs.Empty);
5353
}
@@ -59,32 +59,44 @@ protected override void ShellPage_NavigationRequested(object sender, PathNavigat
5959

6060
protected override void OnNavigationParamsChanged()
6161
{
62+
// Add null check for ColumnParams
63+
if (ColumnParams == null)
64+
return;
65+
6266
if (ColumnParams.NavPathParam is not null)
6367
// This method call is required to load the sorting preferences.
64-
InstanceViewModel.FolderSettings.GetLayoutType(ColumnParams.NavPathParam);
68+
InstanceViewModel?.FolderSettings?.GetLayoutType(ColumnParams.NavPathParam);
6569

66-
ItemDisplayFrame.Navigate(
67-
typeof(ColumnLayoutPage),
68-
new NavigationArguments()
69-
{
70-
IsSearchResultPage = ColumnParams.IsSearchResultPage,
71-
SearchQuery = ColumnParams.SearchQuery,
72-
NavPathParam = ColumnParams.NavPathParam,
73-
SearchPathParam = ColumnParams.SearchPathParam,
74-
AssociatedTabInstance = this,
75-
SelectItems = ColumnParams.SelectItems
76-
});
70+
// Add null check for ItemDisplayFrame
71+
if (ItemDisplayFrame != null)
72+
{
73+
ItemDisplayFrame.Navigate(
74+
typeof(ColumnLayoutPage),
75+
new NavigationArguments()
76+
{
77+
IsSearchResultPage = ColumnParams.IsSearchResultPage,
78+
SearchQuery = ColumnParams.SearchQuery,
79+
NavPathParam = ColumnParams.NavPathParam,
80+
SearchPathParam = ColumnParams.SearchPathParam,
81+
AssociatedTabInstance = this,
82+
SelectItems = ColumnParams.SelectItems
83+
});
84+
}
7785
}
7886

7987
protected override void Page_Loaded(object sender, RoutedEventArgs e)
8088
{
81-
ShellViewModel = new ShellViewModel(InstanceViewModel?.FolderSettings);
82-
ShellViewModel.WorkingDirectoryModified += ViewModel_WorkingDirectoryModified;
83-
ShellViewModel.ItemLoadStatusChanged += FilesystemViewModel_ItemLoadStatusChanged;
84-
ShellViewModel.DirectoryInfoUpdated += FilesystemViewModel_DirectoryInfoUpdated;
85-
ShellViewModel.PageTypeUpdated += FilesystemViewModel_PageTypeUpdated;
86-
ShellViewModel.OnSelectionRequestedEvent += FilesystemViewModel_OnSelectionRequestedEvent;
87-
ShellViewModel.GitDirectoryUpdated += FilesystemViewModel_GitDirectoryUpdated;
89+
// Add null check for InstanceViewModel
90+
if (InstanceViewModel?.FolderSettings != null)
91+
{
92+
ShellViewModel = new ShellViewModel(InstanceViewModel.FolderSettings);
93+
ShellViewModel.WorkingDirectoryModified += ViewModel_WorkingDirectoryModified;
94+
ShellViewModel.ItemLoadStatusChanged += FilesystemViewModel_ItemLoadStatusChanged;
95+
ShellViewModel.DirectoryInfoUpdated += FilesystemViewModel_DirectoryInfoUpdated;
96+
ShellViewModel.PageTypeUpdated += FilesystemViewModel_PageTypeUpdated;
97+
ShellViewModel.OnSelectionRequestedEvent += FilesystemViewModel_OnSelectionRequestedEvent;
98+
ShellViewModel.GitDirectoryUpdated += FilesystemViewModel_GitDirectoryUpdated;
99+
}
88100

89101
PaneHolder = this.FindAscendant<ColumnsLayoutPage>()?.ParentShellPageInstance?.PaneHolder;
90102

@@ -95,16 +107,23 @@ protected override void Page_Loaded(object sender, RoutedEventArgs e)
95107

96108
private void Page_Unloaded(object sender, RoutedEventArgs e)
97109
{
98-
ShellViewModel.WorkingDirectoryModified -= ViewModel_WorkingDirectoryModified;
99-
ShellViewModel.ItemLoadStatusChanged -= FilesystemViewModel_ItemLoadStatusChanged;
100-
ShellViewModel.DirectoryInfoUpdated -= FilesystemViewModel_DirectoryInfoUpdated;
101-
ShellViewModel.PageTypeUpdated -= FilesystemViewModel_PageTypeUpdated;
102-
ShellViewModel.OnSelectionRequestedEvent -= FilesystemViewModel_OnSelectionRequestedEvent;
103-
ShellViewModel.GitDirectoryUpdated -= FilesystemViewModel_GitDirectoryUpdated;
110+
// Add null check for ShellViewModel before unsubscribing
111+
if (ShellViewModel != null)
112+
{
113+
ShellViewModel.WorkingDirectoryModified -= ViewModel_WorkingDirectoryModified;
114+
ShellViewModel.ItemLoadStatusChanged -= FilesystemViewModel_ItemLoadStatusChanged;
115+
ShellViewModel.DirectoryInfoUpdated -= FilesystemViewModel_DirectoryInfoUpdated;
116+
ShellViewModel.PageTypeUpdated -= FilesystemViewModel_PageTypeUpdated;
117+
ShellViewModel.OnSelectionRequestedEvent -= FilesystemViewModel_OnSelectionRequestedEvent;
118+
ShellViewModel.GitDirectoryUpdated -= FilesystemViewModel_GitDirectoryUpdated;
119+
}
104120
}
105121

106122
protected override async void ViewModel_WorkingDirectoryModified(object sender, WorkingDirectoryModifiedEventArgs e)
107123
{
124+
// Add null check for e and e.Path
125+
if (e == null) return;
126+
108127
string value = e.Path;
109128
if (!string.IsNullOrWhiteSpace(value))
110129
await UpdatePathUIToWorkingDirectoryAsync(value);
@@ -114,48 +133,58 @@ private async void ItemDisplayFrame_Navigated(object sender, NavigationEventArgs
114133
{
115134
ContentPage = await GetContentOrNullAsync();
116135

117-
if (ItemDisplayFrame.CurrentSourcePageType == typeof(ColumnLayoutPage))
136+
if (ItemDisplayFrame?.CurrentSourcePageType == typeof(ColumnLayoutPage))
118137
{
119138
// Reset DataGrid Rows that may be in "cut" command mode
120-
ContentPage.ResetItemOpacity();
139+
ContentPage?.ResetItemOpacity();
121140
}
122141

123-
var parameters = e.Parameter as NavigationArguments;
124-
TabBarItemParameter = new TabBarItemParameter()
142+
var parameters = e?.Parameter as NavigationArguments;
143+
if (parameters != null)
125144
{
126-
InitialPageType = typeof(ColumnShellPage),
127-
NavigationParameter = parameters.IsSearchResultPage ? parameters.SearchPathParam : parameters.NavPathParam
128-
};
145+
TabBarItemParameter = new TabBarItemParameter()
146+
{
147+
InitialPageType = typeof(ColumnShellPage),
148+
NavigationParameter = parameters.IsSearchResultPage ? parameters.SearchPathParam : parameters.NavPathParam
149+
};
150+
}
129151
}
130152

131153
public override void Back_Click()
132154
{
133-
ToolbarViewModel.CanGoBack = false;
134-
if (ItemDisplayFrame.CanGoBack)
155+
if (ToolbarViewModel != null)
156+
ToolbarViewModel.CanGoBack = false;
157+
158+
if (ItemDisplayFrame?.CanGoBack == true)
135159
base.Back_Click();
136160
else
137-
this.FindAscendant<ColumnsLayoutPage>().NavigateBack();
161+
this.FindAscendant<ColumnsLayoutPage>()?.NavigateBack();
138162
}
139163

140164
public override void Forward_Click()
141165
{
142-
ToolbarViewModel.CanGoForward = false;
143-
if (ItemDisplayFrame.CanGoForward)
166+
if (ToolbarViewModel != null)
167+
ToolbarViewModel.CanGoForward = false;
168+
169+
if (ItemDisplayFrame?.CanGoForward == true)
144170
base.Forward_Click();
145171
else
146-
this.FindAscendant<ColumnsLayoutPage>().NavigateForward();
172+
this.FindAscendant<ColumnsLayoutPage>()?.NavigateForward();
147173
}
148174

149175
public override void Up_Click()
150176
{
151-
if (!ToolbarViewModel.CanNavigateToParent)
177+
if (ToolbarViewModel?.CanNavigateToParent != true)
152178
return;
153179

154180
this.FindAscendant<ColumnsLayoutPage>()?.NavigateUp();
155181
}
156182

157183
public override void NavigateToPath(string navigationPath, Type sourcePageType, NavigationArguments navArgs = null)
158184
{
185+
if (string.IsNullOrEmpty(navigationPath))
186+
return;
187+
159188
this.FindAscendant<ColumnsLayoutPage>()?.SetSelectedPathOrNavigate(navigationPath, sourcePageType, navArgs);
160189
}
161190

@@ -170,6 +199,9 @@ public override void NavigateToReleaseNotes()
170199
}
171200

172201
public override Task WhenIsCurrent()
173-
=> Task.WhenAll(_IsCurrentInstanceTCS.Task, this.FindAscendant<ColumnsLayoutPage>()?.ParentShellPageInstance?.WhenIsCurrent() ?? Task.CompletedTask);
202+
{
203+
var parentTask = this.FindAscendant<ColumnsLayoutPage>()?.ParentShellPageInstance?.WhenIsCurrent();
204+
return Task.WhenAll(_IsCurrentInstanceTCS.Task, parentTask ?? Task.CompletedTask);
205+
}
174206
}
175-
}
207+
}

0 commit comments

Comments
 (0)