Repository: flutter
Issue: Drawer onPop() not triggering when clicking on Body of Scaffold
Labels: c: new feature,framework,f: material design,P3,team-design,triaged-design

## Use case

We would like to blur the content when drawer is opened and remove blur when drawer is GETTING closed.

## Proposal

Options:

1. Add additional Callbacks to the Drawer widget
```
Drawer(
  child: ...
  // this should come in handy
  onDrawerStateChange: (DrawerState state) {
    switch (state) {
      case DrawerState.open:
        print('its completely open');
      case DrawerState.opening:
        print('its starting to open');
      case DrawerState.closed:
        print('its completely closed');
      case DrawerState.closing:
        print('its closing...');
      default:
        print('Incorrect drawer state');
    }
  }
)
```

2. Allow callbacks over Scaffold:
```
Scaffold(
  drawer: Drawer(...),
  onDrawerOpenStart: ...
  onDrawerCloseStart: ...
  onDrawerClosed: ...
  onDrawerOpened: ...
)
```

## Since there's no implementation, this removal of blur effect is "delayed" after the Drawer has been closed (when calling "menuClosed" in `dispose()` method of Drawer widget), I've had to implement this a bit different. Drawers Parent is now Stack, which first child is GestureDetector with Container 100% width and height. 

```dart

  @override
  void initState() {
    provider = widget.provider;
    super.initState();
    _setMenuState(true);
  }

  @override
  void dispose() {
    _setMenuState(false);
    super.dispose();
  }

  void _doClose() {
    provider.menuState = MenuState.CLOSING;
    pop();
  }

  void _setMenuState(bool state) async {
    // future.delayed.zero ensures everything gets rendered first,
    // after all is done, we move to the next frame.
    await Future.delayed(Duration.zero);

    if (state) {
      provider.menuState = MenuState.OPEN;
    } else {
      provider.menuState = MenuState.CLOSED;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      fit: StackFit.loose,
      children: [
        Container(
          color: Colors.transparent,
          child: GestureDetector(
            onTap: () => _doClose(),
          ),
          width: double.infinity,
          height: double.infinity,
        ),
        Drawer(
          child: SafeArea(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                GestureDetector(
                  onTap: () => _doClose(),
                  child: Padding(
                    padding: EdgeInsets.only(
                        left: Margins.edgeMargin,
                        top: Margins.small,
                        bottom: Margins.small),
                    child: CustomPaint(
                      size: Size.square(25),
                      painter: _ClosePainter(),
                    ),
                  ),
                ),
```

That being said, I think that handling the drawer and trying to update the animation/listen to the callbacks isn't implemented properly. For basics, it does its job perfect, doing anything fancier will be mostly something you will have to created completely by your own (aka implementing your own Drawer).