• Hixie's avatar
    Scoped focus, so you can have a dialog with input controls and not lose your... · 60177a71
    Hixie authored
    Scoped focus, so you can have a dialog with input controls and not lose your focus in the background.
    
    This introduces a GlobalKey registry so that you can tell when a key
    has gone away (so you can unfocus dead dialogs).
    
    Also I added an assert that you're not calling setState() during a
    build. It turns out that doing so means you have a bug, because since
    you're dirty already (you're building), you won't get rebuilt.
    
    The focus code itself is gnarly. It uses a Component and an internal
    Inherited TagNode to manage the focus state, and does crazy things
    like updating its state during build to pretend retroactively that it
    was built with some other state, once someone asks for focus the first
    time (i.e. the first time it's examined, so you can't tell that it was
    in a different state before). It does this so that it can autofocus
    controls which otherwise wouldn't be focused.
    
    This moves all the focus management into Navigator and showDialog(),
    so the complexity is all buried deep and not visible to apps,
    hopefully.
    
    To do something like two tabs that each have an Input widget that
    needs to be focused when you switch panes, you'd need to have two
    Focus objects, one in each tab, and you need to set their autofocus to
    true (maybe that should be the default?).
    60177a71
focus.dart 7.62 KB