## 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.
If you are getting an exception in the logs, and your code is implicated in the first few frames, then please include the source code for the functions involved.

## 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/).
