didChangeMetrics method

  1. @override
void didChangeMetrics ()
override

Called when the application's dimensions change. For example, when a phone is rotated.

This method exposes notifications from Window.onMetricsChanged.

This StatefulWidget implements the parts of the State and WidgetsBindingObserver protocols necessary to react when the device is rotated (or otherwise changes dimensions).
class MetricsReactor extends StatefulWidget {
  const MetricsReactor({ Key key }) : super(key: key);

  @override
  _MetricsReactorState createState() => _MetricsReactorState();
}

class _MetricsReactorState extends State<MetricsReactor> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  Size _lastSize;

  @override
  void didChangeMetrics() {
    setState(() { _lastSize = ui.window.physicalSize; });
  }

  @override
  Widget build(BuildContext context) {
    return Text('Current size: $_lastSize');
  }
}

In general, this is unnecessary as the layout system takes care of automatically recomputing the application geometry when the application size changes.

See also:

  • MediaQuery.of, which provides a similar service with less boilerplate.

Implementation

@override
void didChangeMetrics() {
  if (_lastBottomViewInset < ui.window.viewInsets.bottom) {
    _showCaretOnScreen();
  }
  _lastBottomViewInset = ui.window.viewInsets.bottom;
}