anchor.diff:  }
   
   String _extractTextFromTextSpan(TextSpan span) {
  -  String text = span.text ?? "";
  +  String text = span.text ?? '';
     if (span.children != null) {
       for (TextSpan child in span.children) {
         text += _extractTextFromTextSpan(child);
  
positive.code:         MarkdownBody,
          Column
        ]);
      });
    });
  
    test("Links", () {
      testWidgets((WidgetTester tester) {
        tester.pumpWidget(new Markdown(data: "[Link Text](href)"));
  
        RichText textWidget = tester.widgets.firstWhere((Widget widget) => widget is RichText);
        TextSpan span = textWidget.text;
  
        expect(span.children[0].recognizer.runtimeType, equals(TapGestureRecognizer));
      });
    });
  
    test("Changing config - data", () {
      testWidgets((WidgetTester tester) {
        tester.pumpWidget(new Markdown(data: "Data1"));
        _expectTextStrings(tester.widgets, <String>["Data1"]);
  
        String stateBefore = WidgetsBinding.instance.renderViewElement.toStringDeep();
        tester.pumpWidget(new Markdown(data: "Data1"));
        String stateAfter = WidgetsBinding.instance.renderViewElement.toStringDeep();
        expect(stateBefore, equals(stateAfter));
  
        tester.pumpWidget(new Markdown(data: "Data2"));
        _expectTextStrings(tester.widgets, <String>["Data2"]);
      });
    });
  
    test("Changing config - style", () {
      testWidgets((WidgetTester tester) {
        ThemeData theme = new ThemeData.light();
  
        MarkdownStyle style1 = new MarkdownStyle.defaultFromTheme(theme);
        MarkdownStyle style2 = new MarkdownStyle.largeFromTheme(theme);
  
        tester.pumpWidget(new Markdown(data: "Test", markdownStyle: style1));
  
        String stateBefore = WidgetsBinding.instance.renderViewElement.toStringDeep();
        tester.pumpWidget(new Markdown(data: "Test", markdownStyle: style2));
        String stateAfter = WidgetsBinding.instance.renderViewElement.toStringDeep();
        expect(stateBefore, isNot(stateAfter));
      });
    });
  }
  
  
negative.code: import 'package:flutter/material.dart';
  
  void main() {
    testWidgets('Simple string', (WidgetTester tester) {
        tester.pumpWidget(new MarkdownBody(data: 'Hello'));
  
        Iterable<Widget> widgets = tester.allWidgets;
        _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column, Container, Padding, RichText]);
        _expectTextStrings(widgets, <String>['Hello']);
    });
  
    testWidgets('Header', (WidgetTester tester) {
        tester.pumpWidget(new MarkdownBody(data: '# Header'));
  
        Iterable<Widget> widgets = tester.allWidgets;
        _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column, Container, Padding, RichText]);
        _expectTextStrings(widgets, <String>['Header']);
    });
  
    testWidgets('Empty string', (WidgetTester tester) {
        tester.pumpWidget(new MarkdownBody(data: ''));
  
        Iterable<Widget> widgets = tester.allWidgets;
        _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column]);
    });
  
    testWidgets('Ordered list', (WidgetTester tester) {
        tester.pumpWidget(new MarkdownBody(data: '1. Item 1\n1. Item 2\n2. Item 3'));
  
        Iterable<Widget> widgets = tester.allWidgets;
        _expectTextStrings(widgets, <String>[
          '1.',
          'Item 1',
          '2.',
          'Item 2',
          '3.',
          'Item 3']
        );
    });
  
    testWidgets('Unordered list', (WidgetTester tester) {
        tester.pumpWidget(new MarkdownBody(data: '- Item 1\n- Item 2\n- Item 3'));
  
        Iterable<Widget> widgets = tester.allWidgets;
        _expectTextStrings(widgets, <String>[
          '•',
          'Item 1',
          '•',
          'Item 2',
          '•',
          'Item 3']
        );
    });
  
    testWidgets('Scrollable wrapping', (WidgetTester tester) {
        tester.pumpWidget(new Markdown(data: ''));
  
        List<Widget> widgets = tester.allWidgets.toList();
        _expectWidgetTypes(widgets.take(2), <Type>[
          Markdown,
          ScrollableViewport,
  