void _applyFocusChange()
    {
        _haveScheduledUpdate = false;
        FocusNode previousFocus = _primaryFocus;

        if (_primaryFocus == null && _markedForFocus == null)
        {
            _markedForFocus = rootScope;
        }
        D.assert(FocusManagerUtils._focusDebug($"Refreshing focus state. Next focus will be {_markedForFocus}"));

        if (_markedForFocus != null && _markedForFocus != _primaryFocus)
        {
            HashSet <FocusNode> previousPath = previousFocus?.ancestors != null ? new HashSet <FocusNode>(previousFocus.ancestors) : new HashSet <FocusNode>();
            HashSet <FocusNode> nextPath     = new HashSet <FocusNode>(_markedForFocus.ancestors);
            foreach (FocusNode node in FocusTravesalUtils.difference(nextPath, previousPath))
            {
                _dirtyNodes.Add(node);
            }
            foreach (FocusNode node in FocusTravesalUtils.difference(previousPath, nextPath))
            {
                _dirtyNodes.Add(node);
            }

            _primaryFocus   = _markedForFocus;
            _markedForFocus = null;
        }
        if (previousFocus != _primaryFocus)
        {
            D.assert(FocusManagerUtils._focusDebug($"Updating focus from {previousFocus} to {_primaryFocus}"));
            if (previousFocus != null)
            {
                _dirtyNodes.Add(previousFocus);
            }
            if (_primaryFocus != null)
            {
                _dirtyNodes.Add(_primaryFocus);
            }
        }
        D.assert(FocusManagerUtils._focusDebug($"Notifying {_dirtyNodes.Count} dirty nodes:",
                                               LinqUtils <string, FocusNode> .SelectList(_dirtyNodes, ((FocusNode node) => {
            return(node.toString());
        }))
                                               ));
        foreach (FocusNode node in _dirtyNodes)
        {
            node._notify();
        }
        _dirtyNodes.Clear();
        if (previousFocus != _primaryFocus)
        {
            notifyListeners();
        }
        D.assert(() => {
            if (FocusManagerUtils._kDebugFocus)
            {
                FocusManagerUtils.debugDumpFocusTree();
            }
            return(true);
        });
    }