protected virtual void Dispose(bool disposing) { if (disposing) { _rootPageRenderer?.Dispose(); _viewStack?.Unrealize(); (ShellSection as IShellSectionController).NavigationRequested -= OnNavigationRequested; } }
protected async Task SetCurrentShellItemControllerAsync(IShellItemRenderer value) { _incomingRenderer = value; await _activeTransition; // This means the selected item changed while the active transition // was finishing up if (_incomingRenderer != value || value.ShellItem != this.Shell.CurrentItem) { (value as IDisconnectable)?.Disconnect(); value?.Dispose(); return; } var oldRenderer = _currentShellItemRenderer; (oldRenderer as IDisconnectable)?.Disconnect(); var newRenderer = value; _currentShellItemRenderer = value; AddChildViewController(newRenderer.ViewController); View.AddSubview(newRenderer.ViewController.View); View.SendSubviewToBack(newRenderer.ViewController.View); newRenderer.ViewController.View.Frame = View.Bounds; if (oldRenderer != null) { var transition = CreateShellItemTransition(); _activeTransition = transition.Transition(oldRenderer, newRenderer); await _activeTransition; oldRenderer.ViewController.RemoveFromParentViewController(); oldRenderer.ViewController.View.RemoveFromSuperview(); oldRenderer.Dispose(); } else { View.AddSubview(newRenderer.ViewController.View); } // current renderer is still valid if (_currentShellItemRenderer == value) { UpdateBackgroundColor(); UpdateFlowDirection(); } }
protected virtual void Dispose(bool disposing) { if (_disposed) { return; } _disposed = true; if (disposing) { if (_currentRenderer != null && _currentRenderer.Fragment.IsAlive()) { FragmentTransaction transaction = FragmentManager.BeginTransaction(); transaction.RemoveEx(_currentRenderer.Fragment); transaction.CommitAllowingStateLossEx(); FragmentManager.ExecutePendingTransactionsEx(); } Element.PropertyChanged -= OnElementPropertyChanged; Element.SizeChanged -= OnElementSizeChanged; ((IShellController)Element).RemoveAppearanceObserver(this); // This cast is necessary because IShellFlyoutRenderer doesn't implement IDisposable (_flyoutRenderer as IDisposable)?.Dispose(); _currentRenderer.Dispose(); _currentRenderer = null; } Element = null; // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below. // TODO: set large fields to null. _disposed = true; }