## Steps to Reproduce

Please tell us what you were doing and what went wrong. If you are running flutter tools from the command line, please try adding the `-v` or `--verbose` option to gather more information.

If the problem is with your application's rendering, please attach a screenshot and any relevant source code.

## Logs

Run your application with `flutter run` and attach all the log output.

Run `flutter analyze` and attach any output of that command also.

## Flutter Doctor

Paste the output of running `flutter doctor` here.

> For more information about diagnosing and reporting Flutter bugs, please see [https://flutter.io/bug-reports/](https://flutter.io/bug-reports/).
