Update changelog and pubspec for version bump (#154)

diff --git a/packages/flutter_markdown/CHANGELOG.md b/packages/flutter_markdown/CHANGELOG.md
index 7cda4a9..68dba14 100644
--- a/packages/flutter_markdown/CHANGELOG.md
+++ b/packages/flutter_markdown/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.3.1
+
+ * Expose `tableColumnWidth`
+ * Add `MarkdownStyleSheet.fromCupertinoTheme`
+ * Fix `MarkdownStyleSheet.blockquote`
+ * Flutter for web support
+ * Add physic and shrinkWrap to Markdown widget
+ * Add MarkdownBody.fitContent
+ * Support select text to copy
+ * Fix list bullet alignment
+ * HTML unescape URIs (temporary workaround for [dart-lang/markdown #272](https://github.com/dart-lang/markdown/issues/272))
+ * Rebuilt `example/android` and `example/ios` directories
+
 ## 0.3.0
 
  * Supporting GitHub flavoured Markdown
@@ -6,44 +19,44 @@
 
 ## 0.2.0
 
-* Updated environment sdk constraints to make the package
-  Dart 2 compatible.  As a result, usage of this version and higher 
-  requires a Dart 2 SDK.
+ * Updated environment sdk constraints to make the package
+   Dart 2 compatible.  As a result, usage of this version and higher
+   requires a Dart 2 SDK.
 
 ## 0.1.6
 
-* Updated `markdown` dependency.
+ * Updated `markdown` dependency.
 
 ## 0.1.5
 
-* Add `mockito` as a dev dependency. Eliminate use of `package:http`, which
-  is no longer part of Flutter.
+ * Add `mockito` as a dev dependency. Eliminate use of `package:http`, which
+   is no longer part of Flutter.
 
 ## 0.1.4
 
-* Add `li` style to bullets 
+ * Add `li` style to bullets
 
 ## 0.1.3
 
-* Add `path` and `http` as declared dependencies in `pubspec.yaml`
+ * Add `path` and `http` as declared dependencies in `pubspec.yaml`
 
 ## 0.1.2
 
-* Add support for horizontal rules.
-* Fix the `onTap` callback on images nested in hyperlinks
+ * Add support for horizontal rules.
+ * Fix the `onTap` callback on images nested in hyperlinks
 
 ## 0.1.1
 
-* Add support for local file paths in image links. Make sure to set the
-  `imageDirectory` property to specify the base directory containing the image
-  files.
+ * Add support for local file paths in image links. Make sure to set the
+   `imageDirectory` property to specify the base directory containing the image
+   files.
 
 ## 0.1.0
 
-* Roll the dependency on `markdown` to 1.0.0
-* Add a test and example for image links
-* Fix the `onTap` callback on hyperlinks
+ * Roll the dependency on `markdown` to 1.0.0
+ * Add a test and example for image links
+ * Fix the `onTap` callback on hyperlinks
 
 ## 0.0.9
 
-* First published version
+ * First published version
diff --git a/packages/flutter_markdown/lib/src/_functions_io.dart b/packages/flutter_markdown/lib/src/_functions_io.dart
index 40819a7..c4b99d1 100644
--- a/packages/flutter_markdown/lib/src/_functions_io.dart
+++ b/packages/flutter_markdown/lib/src/_functions_io.dart
@@ -11,8 +11,7 @@
 import 'style_sheet.dart';
 import 'widget.dart';
 
-typedef Widget ImageBuilder(
-    Uri uri, String imageDirectory, double width, double height);
+typedef Widget ImageBuilder(Uri uri, String imageDirectory, double width, double height);
 
 final ImageBuilder kDefaultImageBuilder = (
   Uri uri,
@@ -29,9 +28,7 @@
   } else if (uri.scheme == "resource") {
     return Image.asset(uri.path, width: width, height: height);
   } else {
-    Uri fileUri = imageDirectory != null
-        ? Uri.parse(imageDirectory + uri.toString())
-        : uri;
+    Uri fileUri = imageDirectory != null ? Uri.parse(imageDirectory + uri.toString()) : uri;
     if (fileUri.scheme == 'http' || fileUri.scheme == 'https') {
       return Image.network(fileUri.toString(), width: width, height: height);
     } else {
@@ -40,8 +37,7 @@
   }
 };
 
-final MarkdownStyleSheet Function(BuildContext, MarkdownStyleSheetBaseTheme)
-    kFallbackStyle = (
+final MarkdownStyleSheet Function(BuildContext, MarkdownStyleSheetBaseTheme) kFallbackStyle = (
   BuildContext context,
   MarkdownStyleSheetBaseTheme baseTheme,
 ) {
diff --git a/packages/flutter_markdown/lib/src/_functions_web.dart b/packages/flutter_markdown/lib/src/_functions_web.dart
index 90b276e..568e142 100644
--- a/packages/flutter_markdown/lib/src/_functions_web.dart
+++ b/packages/flutter_markdown/lib/src/_functions_web.dart
@@ -12,8 +12,7 @@
 import 'style_sheet.dart';
 import 'widget.dart';
 
-typedef Widget ImageBuilder(
-    Uri uri, String imageDirectory, double width, double height);
+typedef Widget ImageBuilder(Uri uri, String imageDirectory, double width, double height);
 
 final ImageBuilder kDefaultImageBuilder = (
   Uri uri,
@@ -40,8 +39,7 @@
   }
 };
 
-final MarkdownStyleSheet Function(BuildContext, MarkdownStyleSheetBaseTheme)
-    kFallbackStyle = (
+final MarkdownStyleSheet Function(BuildContext, MarkdownStyleSheetBaseTheme) kFallbackStyle = (
   BuildContext context,
   MarkdownStyleSheetBaseTheme baseTheme,
 ) {
diff --git a/packages/flutter_markdown/lib/src/builder.dart b/packages/flutter_markdown/lib/src/builder.dart
index e8b28d1..949a821 100644
--- a/packages/flutter_markdown/lib/src/builder.dart
+++ b/packages/flutter_markdown/lib/src/builder.dart
@@ -234,9 +234,7 @@
 
       if (current.children.isNotEmpty) {
         child = Column(
-          crossAxisAlignment: fitContent
-              ? CrossAxisAlignment.start
-              : CrossAxisAlignment.stretch,
+          crossAxisAlignment: fitContent ? CrossAxisAlignment.start : CrossAxisAlignment.stretch,
           children: current.children,
         );
       } else {
@@ -458,9 +456,7 @@
   List<Widget> _mergeInlineChildren(List<Widget> children) {
     List<Widget> mergedTexts = <Widget>[];
     for (Widget child in children) {
-      if (mergedTexts.isNotEmpty &&
-          mergedTexts.last is RichText &&
-          child is RichText) {
+      if (mergedTexts.isNotEmpty && mergedTexts.last is RichText && child is RichText) {
         RichText previous = mergedTexts.removeLast();
         TextSpan previousTextSpan = previous.text;
         List<TextSpan> children = previousTextSpan.children != null
diff --git a/packages/flutter_markdown/lib/src/style_sheet.dart b/packages/flutter_markdown/lib/src/style_sheet.dart
index ea678b2..87ad589 100644
--- a/packages/flutter_markdown/lib/src/style_sheet.dart
+++ b/packages/flutter_markdown/lib/src/style_sheet.dart
@@ -314,8 +314,7 @@
       blockquoteDecoration: blockquoteDecoration ?? this.blockquoteDecoration,
       codeblockPadding: codeblockPadding ?? this.codeblockPadding,
       codeblockDecoration: codeblockDecoration ?? this.codeblockDecoration,
-      horizontalRuleDecoration:
-          horizontalRuleDecoration ?? this.horizontalRuleDecoration,
+      horizontalRuleDecoration: horizontalRuleDecoration ?? this.horizontalRuleDecoration,
       textScaleFactor: textScaleFactor ?? this.textScaleFactor,
     );
   }
diff --git a/packages/flutter_markdown/lib/src/widget.dart b/packages/flutter_markdown/lib/src/widget.dart
index da1ebaa..3ef3e78 100644
--- a/packages/flutter_markdown/lib/src/widget.dart
+++ b/packages/flutter_markdown/lib/src/widget.dart
@@ -127,8 +127,7 @@
   _MarkdownWidgetState createState() => _MarkdownWidgetState();
 }
 
-class _MarkdownWidgetState extends State<MarkdownWidget>
-    implements MarkdownBuilderDelegate {
+class _MarkdownWidgetState extends State<MarkdownWidget> implements MarkdownBuilderDelegate {
   List<Widget> _children;
   final List<GestureRecognizer> _recognizers = <GestureRecognizer>[];
 
@@ -141,8 +140,7 @@
   @override
   void didUpdateWidget(MarkdownWidget oldWidget) {
     super.didUpdateWidget(oldWidget);
-    if (widget.data != oldWidget.data ||
-        widget.styleSheet != oldWidget.styleSheet) {
+    if (widget.data != oldWidget.data || widget.styleSheet != oldWidget.styleSheet) {
       _parseMarkdown();
     }
   }
@@ -154,10 +152,8 @@
   }
 
   void _parseMarkdown() {
-    final MarkdownStyleSheet fallbackStyleSheet =
-        kFallbackStyle(context, widget.styleSheetTheme);
-    final MarkdownStyleSheet styleSheet =
-        fallbackStyleSheet.merge(widget.styleSheet);
+    final MarkdownStyleSheet fallbackStyleSheet = kFallbackStyle(context, widget.styleSheetTheme);
+    final MarkdownStyleSheet styleSheet = fallbackStyleSheet.merge(widget.styleSheet);
 
     _disposeRecognizers();
 
@@ -168,20 +164,20 @@
       encodeHtml: false,
     );
     final MarkdownBuilder builder = MarkdownBuilder(
-        delegate: this,
-        selectable: widget.selectable,
-        styleSheet: styleSheet,
-        imageDirectory: widget.imageDirectory,
-        imageBuilder: widget.imageBuilder,
-        checkboxBuilder: widget.checkboxBuilder,
-        fitContent: widget.fitContent);
+      delegate: this,
+      selectable: widget.selectable,
+      styleSheet: styleSheet,
+      imageDirectory: widget.imageDirectory,
+      imageBuilder: widget.imageBuilder,
+      checkboxBuilder: widget.checkboxBuilder,
+      fitContent: widget.fitContent,
+    );
     _children = builder.build(document.parseLines(lines));
   }
 
   void _disposeRecognizers() {
     if (_recognizers.isEmpty) return;
-    final List<GestureRecognizer> localRecognizers =
-        List<GestureRecognizer>.from(_recognizers);
+    final List<GestureRecognizer> localRecognizers = List<GestureRecognizer>.from(_recognizers);
     _recognizers.clear();
     for (GestureRecognizer recognizer in localRecognizers) recognizer.dispose();
   }
@@ -259,8 +255,7 @@
     if (children.length == 1) return children.single;
     return Column(
       mainAxisSize: shrinkWrap ? MainAxisSize.min : MainAxisSize.max,
-      crossAxisAlignment:
-          fitContent ? CrossAxisAlignment.start : CrossAxisAlignment.stretch,
+      crossAxisAlignment: fitContent ? CrossAxisAlignment.start : CrossAxisAlignment.stretch,
       children: children,
     );
   }
diff --git a/packages/flutter_markdown/pubspec.yaml b/packages/flutter_markdown/pubspec.yaml
index fca2515..72a08c1 100644
--- a/packages/flutter_markdown/pubspec.yaml
+++ b/packages/flutter_markdown/pubspec.yaml
@@ -2,7 +2,7 @@
 author: Flutter Authors <flutter-dev@googlegroups.com>
 description: A Markdown renderer for Flutter.
 homepage: https://github.com/flutter/flutter_markdown
-version: 0.3.0
+version: 0.3.1
 
 dependencies:
   flutter:
diff --git a/packages/flutter_markdown/test/flutter_markdown_test.dart b/packages/flutter_markdown/test/flutter_markdown_test.dart
index b257853..2432a48 100644
--- a/packages/flutter_markdown/test/flutter_markdown_test.dart
+++ b/packages/flutter_markdown/test/flutter_markdown_test.dart
@@ -23,8 +23,7 @@
     await tester.pumpWidget(_boilerplate(const MarkdownBody(data: 'Hello')));
 
     final Iterable<Widget> widgets = tester.allWidgets;
-    _expectWidgetTypes(
-        widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
+    _expectWidgetTypes(widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
     _expectTextStrings(widgets, <String>['Hello']);
   });
 
@@ -32,8 +31,7 @@
     await tester.pumpWidget(_boilerplate(const MarkdownBody(data: '# Header')));
 
     final Iterable<Widget> widgets = tester.allWidgets;
-    _expectWidgetTypes(
-        widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
+    _expectWidgetTypes(widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
     _expectTextStrings(widgets, <String>['Header']);
   });
 
@@ -45,8 +43,7 @@
   });
 
   testWidgets('Scrollable code block', (WidgetTester tester) async {
-    const String data =
-        '```\nvoid main() {\n  print(\'Hello World!\');\n}\n```';
+    const String data = '```\nvoid main() {\n  print(\'Hello World!\');\n}\n```';
 
     await tester.pumpWidget(_boilerplate(MediaQuery(
       data: MediaQueryData(),
@@ -54,27 +51,22 @@
     )));
 
     final Iterable<Widget> widgets = tester.allWidgets;
-    expect(widgets.where((Widget widget) => widget is SingleChildScrollView),
-        isNotEmpty);
+    expect(widgets.where((Widget widget) => widget is SingleChildScrollView), isNotEmpty);
   });
 
   testWidgets('Strikethrough', (WidgetTester tester) async {
-    await tester.pumpWidget(
-        _boilerplate(const MarkdownBody(data: '~~strikethrough~~')));
+    await tester.pumpWidget(_boilerplate(const MarkdownBody(data: '~~strikethrough~~')));
 
     final Iterable<Widget> widgets = tester.allWidgets;
-    _expectWidgetTypes(
-        widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
+    _expectWidgetTypes(widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
     _expectTextStrings(widgets, <String>['strikethrough']);
   });
 
   testWidgets('Line break', (WidgetTester tester) async {
-    await tester
-        .pumpWidget(_boilerplate(const MarkdownBody(data: 'line 1  \nline 2')));
+    await tester.pumpWidget(_boilerplate(const MarkdownBody(data: 'line 1  \nline 2')));
 
     final Iterable<Widget> widgets = tester.allWidgets;
-    _expectWidgetTypes(
-        widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
+    _expectWidgetTypes(widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
     _expectTextStrings(widgets, <String>['line 1\nline 2']);
   });
 
@@ -151,8 +143,7 @@
     await tester.pumpWidget(_boilerplate(const MarkdownBody(data: '-----')));
 
     final Iterable<Widget> widgets = tester.allWidgets;
-    _expectWidgetTypes(
-        widgets, <Type>[Directionality, MarkdownBody, DecoratedBox, SizedBox]);
+    _expectWidgetTypes(widgets, <Type>[Directionality, MarkdownBody, DecoratedBox, SizedBox]);
   });
 
   testWidgets('Scrollable wrapping', (WidgetTester tester) async {
@@ -188,8 +179,7 @@
       expect(tapResult, 'href');
     });
 
-    testWidgets('should work with nested elements',
-        (WidgetTester tester) async {
+    testWidgets('should work with nested elements', (WidgetTester tester) async {
       final List<String> tapResults = <String>[];
       await tester.pumpWidget(_boilerplate(Markdown(
         data: '[Link `with nested code` Text](href)',
@@ -224,8 +214,7 @@
         onTapLink: (value) => tapResults.add(value),
       )));
 
-      final RichText textWidget =
-          tester.widgetList(find.byType(RichText)).first;
+      final RichText textWidget = tester.widgetList(find.byType(RichText)).first;
       final TextSpan span = textWidget.text;
 
       final List<Type> gestureRecognizerTypes = <Type>[];
@@ -273,8 +262,7 @@
     });
 
     testWidgets('should work with a link', (WidgetTester tester) async {
-      await tester.pumpWidget(
-          _boilerplate(const Markdown(data: '![alt](https://img#50x50)')));
+      await tester.pumpWidget(_boilerplate(const Markdown(data: '![alt](https://img#50x50)')));
 
       final Image image = tester.widget(find.byType(Image));
       final NetworkImage networkImage = image.image;
@@ -283,41 +271,35 @@
       expect(image.height, 50);
     });
 
-    testWidgets('should work with relative remote image',
-        (WidgetTester tester) async {
+    testWidgets('should work with relative remote image', (WidgetTester tester) async {
       await tester.pumpWidget(_boilerplate(const Markdown(
         data: '![alt](/img.png)',
         imageDirectory: 'http://localhost',
       )));
 
       final Iterable<Widget> widgets = tester.allWidgets;
-      final Image image =
-          widgets.firstWhere((Widget widget) => widget is Image);
+      final Image image = widgets.firstWhere((Widget widget) => widget is Image);
 
       expect(image.image is NetworkImage, isTrue);
       expect((image.image as NetworkImage).url, 'http://localhost/img.png');
     });
 
-    testWidgets('should not escape ampersands in links',
-        (WidgetTester tester) async {
+    testWidgets('should not escape ampersands in links', (WidgetTester tester) async {
       await tester.pumpWidget(_boilerplate(const Markdown(
           data:
               '![alt](https://preview.redd.it/sg3q5cuedod31.jpg?width=640&crop=smart&auto=webp&s=497e6295e0c0fc2ce7df5a324fe1acd7b5a5264f)')));
 
-      final Image image =
-          tester.allWidgets.firstWhere((Widget widget) => widget is Image);
+      final Image image = tester.allWidgets.firstWhere((Widget widget) => widget is Image);
       final NetworkImage networkImage = image.image;
       expect(networkImage.url,
           'https://preview.redd.it/sg3q5cuedod31.jpg?width=640&crop=smart&auto=webp&s=497e6295e0c0fc2ce7df5a324fe1acd7b5a5264f');
     });
 
     testWidgets('local files should be files', (WidgetTester tester) async {
-      await tester
-          .pumpWidget(_boilerplate(const Markdown(data: '![alt](http.png)')));
+      await tester.pumpWidget(_boilerplate(const Markdown(data: '![alt](http.png)')));
 
       final Iterable<Widget> widgets = tester.allWidgets;
-      final Image image =
-          widgets.firstWhere((Widget widget) => widget is Image);
+      final Image image = widgets.firstWhere((Widget widget) => widget is Image);
 
       expect(image.image is FileImage, isTrue);
     });
@@ -328,17 +310,14 @@
       )));
 
       final Iterable<Widget> widgets = tester.allWidgets;
-      final Image image =
-          widgets.firstWhere((Widget widget) => widget is Image);
+      final Image image = widgets.firstWhere((Widget widget) => widget is Image);
 
       expect(image.image is AssetImage, isTrue);
       expect((image.image as AssetImage).assetName, 'assets/logo.png');
     });
 
-    testWidgets('should work with local image files',
-        (WidgetTester tester) async {
-      await tester.pumpWidget(
-          _boilerplate(const Markdown(data: '![alt](img.png#50x50)')));
+    testWidgets('should work with local image files', (WidgetTester tester) async {
+      await tester.pumpWidget(_boilerplate(const Markdown(data: '![alt](img.png#50x50)')));
 
       final Image image = tester.widget(find.byType(Image));
       final FileImage fileImage = image.image;
@@ -347,10 +326,8 @@
       expect(image.height, 50);
     });
 
-    testWidgets('should show properly next to text',
-        (WidgetTester tester) async {
-      await tester.pumpWidget(
-          _boilerplate(const Markdown(data: 'Hello ![alt](img#50x50)')));
+    testWidgets('should show properly next to text', (WidgetTester tester) async {
+      await tester.pumpWidget(_boilerplate(const Markdown(data: 'Hello ![alt](img#50x50)')));
 
       final RichText richText = tester.widget(find.byType(RichText));
       TextSpan textSpan = richText.text;
@@ -358,16 +335,14 @@
       expect(textSpan.style, isNotNull);
     });
 
-    testWidgets('should work when nested in a link',
-        (WidgetTester tester) async {
+    testWidgets('should work when nested in a link', (WidgetTester tester) async {
       final List<String> tapResults = <String>[];
       await tester.pumpWidget(_boilerplate(Markdown(
         data: '[![alt](https://img#50x50)](href)',
         onTapLink: (value) => tapResults.add(value),
       )));
 
-      final GestureDetector detector =
-          tester.widget(find.byType(GestureDetector));
+      final GestureDetector detector = tester.widget(find.byType(GestureDetector));
 
       detector.onTap();
 
@@ -375,16 +350,14 @@
       expect(tapResults, everyElement('href'));
     });
 
-    testWidgets('should work when nested in a link with text',
-        (WidgetTester tester) async {
+    testWidgets('should work when nested in a link with text', (WidgetTester tester) async {
       final List<String> tapResults = <String>[];
       await tester.pumpWidget(_boilerplate(Markdown(
         data: '[Text before ![alt](https://img#50x50) text after](href)',
         onTapLink: (value) => tapResults.add(value),
       )));
 
-      final GestureDetector detector =
-          tester.widget(find.byType(GestureDetector));
+      final GestureDetector detector = tester.widget(find.byType(GestureDetector));
       detector.onTap();
 
       final Iterable<RichText> texts = tester.widgetList(find.byType(RichText));
@@ -408,8 +381,7 @@
       expect(tapResults, everyElement('href'));
     });
 
-    testWidgets('should work alongside different links',
-        (WidgetTester tester) async {
+    testWidgets('should work alongside different links', (WidgetTester tester) async {
       final List<String> tapResults = <String>[];
       await tester.pumpWidget(_boilerplate(Markdown(
         data:
@@ -422,8 +394,7 @@
       final TextSpan firstSpan = firstTextWidget.text;
       (firstSpan.recognizer as TapGestureRecognizer).onTap();
 
-      final GestureDetector detector =
-          tester.widget(find.byType(GestureDetector));
+      final GestureDetector detector = tester.widget(find.byType(GestureDetector));
       detector.onTap();
 
       final RichText lastTextWidget = texts.last;
@@ -449,8 +420,7 @@
       await tester.pumpWidget(_boilerplate(const MarkdownBody(data: data)));
 
       final Iterable<Widget> widgets = tester.allWidgets;
-      _expectTextStrings(
-          widgets, <String>['Header 1', 'Header 2', 'Col 1', 'Col 2']);
+      _expectTextStrings(widgets, <String>['Header 1', 'Header 2', 'Col 1', 'Col 2']);
     });
 
     testWidgets('work without the outer pipes', (WidgetTester tester) async {
@@ -458,16 +428,14 @@
       await tester.pumpWidget(_boilerplate(const MarkdownBody(data: data)));
 
       final Iterable<Widget> widgets = tester.allWidgets;
-      _expectTextStrings(
-          widgets, <String>['Header 1', 'Header 2', 'Col 1', 'Col 2']);
+      _expectTextStrings(widgets, <String>['Header 1', 'Header 2', 'Col 1', 'Col 2']);
     });
 
     testWidgets('should work with alignments', (WidgetTester tester) async {
       const String data = '|Header 1|Header 2|\n|:----:|----:|\n|Col 1|Col 2|';
       await tester.pumpWidget(_boilerplate(const MarkdownBody(data: data)));
 
-      final Iterable<DefaultTextStyle> styles =
-          tester.widgetList(find.byType(DefaultTextStyle));
+      final Iterable<DefaultTextStyle> styles = tester.widgetList(find.byType(DefaultTextStyle));
 
       expect(styles.first.textAlign, TextAlign.center);
       expect(styles.last.textAlign, TextAlign.right);
@@ -478,15 +446,13 @@
       await tester.pumpWidget(_boilerplate(MarkdownBody(data: data)));
 
       final Iterable<Widget> widgets = tester.allWidgets;
-      final RichText richText =
-          widgets.lastWhere((Widget widget) => widget is RichText);
+      final RichText richText = widgets.lastWhere((Widget widget) => widget is RichText);
 
       _expectTextStrings(widgets, <String>['Header', 'italic']);
       expect(richText.text.style.fontStyle, FontStyle.italic);
     });
 
-    testWidgets('should work next to other tables',
-        (WidgetTester tester) async {
+    testWidgets('should work next to other tables', (WidgetTester tester) async {
       const String data = '|first header|\n|----|\n|first col|\n\n'
           '|second header|\n|----|\n|second col|';
       await tester.pumpWidget(_boilerplate(const MarkdownBody(data: data)));
@@ -496,19 +462,16 @@
       expect(tables.length, 2);
     });
 
-    testWidgets('column width should follow stylesheet',
-        (WidgetTester tester) async {
+    testWidgets('column width should follow stylesheet', (WidgetTester tester) async {
       final ThemeData theme = ThemeData.light().copyWith(textTheme: textTheme);
 
       const String data = '|Header|\n|----|\n|Column|';
       const FixedColumnWidth columnWidth = FixedColumnWidth(100);
-      final MarkdownStyleSheet style =
-          MarkdownStyleSheet.fromTheme(theme).copyWith(
+      final MarkdownStyleSheet style = MarkdownStyleSheet.fromTheme(theme).copyWith(
         tableColumnWidth: columnWidth,
       );
 
-      await tester.pumpWidget(
-          _boilerplate(MarkdownBody(data: data, styleSheet: style)));
+      await tester.pumpWidget(_boilerplate(MarkdownBody(data: data, styleSheet: style)));
 
       final Table table = tester.widget(find.byType(Table));
 
@@ -517,21 +480,17 @@
   });
 
   group('Uri data scheme', () {
-    testWidgets('should work with image in uri data scheme',
-        (WidgetTester tester) async {
+    testWidgets('should work with image in uri data scheme', (WidgetTester tester) async {
       await tester.pumpWidget(_boilerplate(const Markdown(
-        data:
-            '![alt](data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=)',
+        data: '![alt](data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=)',
       )));
 
       final Iterable<Widget> widgets = tester.allWidgets;
-      final Image image =
-          widgets.firstWhere((Widget widget) => widget is Image);
+      final Image image = widgets.firstWhere((Widget widget) => widget is Image);
       expect(image.image.runtimeType, MemoryImage);
     });
 
-    testWidgets('should work with base64 text in uri data scheme',
-        (WidgetTester tester) async {
+    testWidgets('should work with base64 text in uri data scheme', (WidgetTester tester) async {
       const String imageData = '![alt](data:text/plan;base64,Rmx1dHRlcg==)';
       await tester.pumpWidget(_boilerplate(const Markdown(data: imageData)));
 
@@ -540,8 +499,7 @@
       expect(widget.data, 'Flutter');
     });
 
-    testWidgets('should work with text in uri data scheme',
-        (WidgetTester tester) async {
+    testWidgets('should work with text in uri data scheme', (WidgetTester tester) async {
       const String imageData = '![alt](data:text/plan,Hello%2C%20Flutter)';
       await tester.pumpWidget(_boilerplate(const Markdown(data: imageData)));
 
@@ -550,8 +508,7 @@
       expect(widget.data, 'Hello, Flutter');
     });
 
-    testWidgets('should work with empty uri data scheme',
-        (WidgetTester tester) async {
+    testWidgets('should work with empty uri data scheme', (WidgetTester tester) async {
       const String imageData = '![alt](data:,)';
       await tester.pumpWidget(_boilerplate(const Markdown(data: imageData)));
 
@@ -567,8 +524,7 @@
       )));
 
       final Iterable<Widget> widgets = tester.allWidgets;
-      final SizedBox widget =
-          widgets.firstWhere((Widget widget) => widget is SizedBox);
+      final SizedBox widget = widgets.firstWhere((Widget widget) => widget is SizedBox);
       expect(widget.runtimeType, SizedBox);
     });
   });
@@ -584,12 +540,9 @@
       _expectTextStrings(tester.allWidgets, <String>['<']);
     });
 
-    testWidgets('existing HTML entities when parsing',
-        (WidgetTester tester) async {
-      await tester.pumpWidget(
-          _boilerplate(const Markdown(data: '&amp; &copy; &#60; &#x0007B;')));
-      _expectTextStrings(
-          tester.allWidgets, <String>['&amp; &copy; &#60; &#x0007B;']);
+    testWidgets('existing HTML entities when parsing', (WidgetTester tester) async {
+      await tester.pumpWidget(_boilerplate(const Markdown(data: '&amp; &copy; &#60; &#x0007B;')));
+      _expectTextStrings(tester.allWidgets, <String>['&amp; &copy; &#60; &#x0007B;']);
     });
   });
 
@@ -627,8 +580,7 @@
       final ThemeData theme = ThemeData.light().copyWith(textTheme: textTheme);
 
       final MarkdownStyleSheet style1 = MarkdownStyleSheet.fromTheme(theme);
-      final MarkdownStyleSheet style2 =
-          MarkdownStyleSheet.largeFromTheme(theme);
+      final MarkdownStyleSheet style2 = MarkdownStyleSheet.largeFromTheme(theme);
       expect(style1, isNot(style2));
 
       await tester.pumpWidget(
@@ -645,11 +597,9 @@
 
     testWidgets(' - imageBuilder', (WidgetTester tester) async {
       final String data = '![alt](https://img.png)';
-      final MarkdownImageBuilder builder =
-          (_) => Image.asset('assets/logo.png');
+      final MarkdownImageBuilder builder = (_) => Image.asset('assets/logo.png');
 
-      await tester.pumpWidget(
-          _boilerplate(Markdown(data: data, imageBuilder: builder)));
+      await tester.pumpWidget(_boilerplate(Markdown(data: data, imageBuilder: builder)));
 
       final Image image = tester.widget(find.byType(Image));
 
@@ -659,11 +609,9 @@
 
     testWidgets(' - checkboxBuilder', (WidgetTester tester) async {
       final String data = '- [x] Item 1\n- [ ] Item 2';
-      final MarkdownCheckboxBuilder builder =
-          (bool checked) => Text('$checked');
+      final MarkdownCheckboxBuilder builder = (bool checked) => Text('$checked');
 
-      await tester.pumpWidget(
-          _boilerplate(Markdown(data: data, checkboxBuilder: builder)));
+      await tester.pumpWidget(_boilerplate(Markdown(data: data, checkboxBuilder: builder)));
 
       final Iterable<Widget> widgets = tester.allWidgets;
 
@@ -675,8 +623,7 @@
       ]);
     });
 
-    testWidgets(' - should use style textScaleFactor in RichText',
-        (WidgetTester tester) async {
+    testWidgets(' - should use style textScaleFactor in RichText', (WidgetTester tester) async {
       await tester.pumpWidget(_boilerplate(
         MarkdownBody(
           styleSheet: MarkdownStyleSheet(textScaleFactor: 2.0),
@@ -700,13 +647,10 @@
     });
 
     testWidgets('equality - Cupertino', (WidgetTester tester) async {
-      final CupertinoThemeData theme =
-          CupertinoThemeData(brightness: Brightness.light);
+      final CupertinoThemeData theme = CupertinoThemeData(brightness: Brightness.light);
 
-      final MarkdownStyleSheet style1 =
-          MarkdownStyleSheet.fromCupertinoTheme(theme);
-      final MarkdownStyleSheet style2 =
-          MarkdownStyleSheet.fromCupertinoTheme(theme);
+      final MarkdownStyleSheet style1 = MarkdownStyleSheet.fromCupertinoTheme(theme);
+      final MarkdownStyleSheet style2 = MarkdownStyleSheet.fromCupertinoTheme(theme);
       expect(style1, equals(style2));
       expect(style1.hashCode, equals(style2.hashCode));
     });
@@ -714,8 +658,7 @@
     testWidgets('merge', (WidgetTester tester) async {
       final ThemeData theme = ThemeData.light().copyWith(textTheme: textTheme);
       final MarkdownStyleSheet style1 = MarkdownStyleSheet.fromTheme(theme);
-      final MarkdownStyleSheet style2 =
-          MarkdownStyleSheet(p: TextStyle(color: Colors.red));
+      final MarkdownStyleSheet style2 = MarkdownStyleSheet(p: TextStyle(color: Colors.red));
 
       final MarkdownStyleSheet merged = style1.merge(style2);
       expect(merged.p.color, Colors.red);
@@ -776,8 +719,7 @@
 
 String _dumpRenderView() {
   return WidgetsBinding.instance.renderViewElement.toStringDeep().replaceAll(
-      RegExp(r'SliverChildListDelegate#\d+', multiLine: true),
-      'SliverChildListDelegate');
+      RegExp(r'SliverChildListDelegate#\d+', multiLine: true), 'SliverChildListDelegate');
 }
 
 /// Wraps a widget with a left-to-right [Directionality] for tests.
@@ -809,23 +751,19 @@
   final MockHttpClientResponse response = MockHttpClientResponse();
   final MockHttpHeaders headers = MockHttpHeaders();
 
-  when(client.getUrl(any))
-      .thenAnswer((_) => Future<io.HttpClientRequest>.value(request));
+  when(client.getUrl(any)).thenAnswer((_) => Future<io.HttpClientRequest>.value(request));
   when(request.headers).thenReturn(headers);
-  when(request.close())
-      .thenAnswer((_) => Future<io.HttpClientResponse>.value(response));
+  when(request.close()).thenAnswer((_) => Future<io.HttpClientResponse>.value(response));
   when(response.contentLength).thenReturn(_transparentImage.length);
   when(response.statusCode).thenReturn(io.HttpStatus.ok);
   when(response.listen(any)).thenAnswer((Invocation invocation) {
     final void Function(List<int>) onData = invocation.positionalArguments[0];
     final void Function() onDone = invocation.namedArguments[#onDone];
-    final void Function(Object, [StackTrace]) onError =
-        invocation.namedArguments[#onError];
+    final void Function(Object, [StackTrace]) onError = invocation.namedArguments[#onError];
     final bool cancelOnError = invocation.namedArguments[#cancelOnError];
 
     return Stream<List<int>>.fromIterable(<List<int>>[_transparentImage])
-        .listen(onData,
-            onDone: onDone, onError: onError, cancelOnError: cancelOnError);
+        .listen(onData, onDone: onDone, onError: onError, cancelOnError: cancelOnError);
   });
 
   return client;