[flutter_markdown] Unable to use MarkdownElementBuilder to act those tags without children. (#3952)
fix https://github.com/flutter/flutter/issues/126402
- [ ] I updated `pubspec.yaml` with an appropriate new version according to the [pub versioning philosophy], or this PR is [exempt from version changes].
- [ ] I updated `CHANGELOG.md` to add a description of the change, [following repository CHANGELOG style].
- [ ] I updated/added relevant documentation (doc comments with `///`).
- [ ] I added new tests to check the change I am making, or this PR is [test-exempt].
- [ ] All existing and new tests are passing.
diff --git a/packages/flutter_markdown/CHANGELOG.md b/packages/flutter_markdown/CHANGELOG.md
index f6a3351..3e6a593 100644
--- a/packages/flutter_markdown/CHANGELOG.md
+++ b/packages/flutter_markdown/CHANGELOG.md
@@ -1,9 +1,10 @@
-## NEXT
+## 0.6.15
* Fixes unawaited_futures violations.
* Updates minimum Flutter version to 3.3.
* Aligns Dart and Flutter SDK constraints.
* Replace `describeEnum` with the `name` getter.
+* Supports custom rendering of tags without children.
## 0.6.14
diff --git a/packages/flutter_markdown/lib/src/builder.dart b/packages/flutter_markdown/lib/src/builder.dart
index e852113..475c510 100644
--- a/packages/flutter_markdown/lib/src/builder.dart
+++ b/packages/flutter_markdown/lib/src/builder.dart
@@ -454,7 +454,11 @@
final Widget? child =
builders[tag]!.visitElementAfter(element, styleSheet.styles[tag]);
if (child != null) {
- current.children[0] = child;
+ if (current.children.isEmpty) {
+ current.children.add(child);
+ } else {
+ current.children[0] = child;
+ }
}
} else if (tag == 'img') {
// create an image widget for this image
diff --git a/packages/flutter_markdown/pubspec.yaml b/packages/flutter_markdown/pubspec.yaml
index 2779c51..74b886c 100644
--- a/packages/flutter_markdown/pubspec.yaml
+++ b/packages/flutter_markdown/pubspec.yaml
@@ -4,7 +4,7 @@
formatted with simple Markdown tags.
repository: https://github.com/flutter/packages/tree/main/packages/flutter_markdown
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_markdown%22
-version: 0.6.14
+version: 0.6.15
environment:
sdk: ">=2.18.0 <4.0.0"
diff --git a/packages/flutter_markdown/test/custom_syntax_test.dart b/packages/flutter_markdown/test/custom_syntax_test.dart
index 6254a1b..46ed3ed 100644
--- a/packages/flutter_markdown/test/custom_syntax_test.dart
+++ b/packages/flutter_markdown/test/custom_syntax_test.dart
@@ -112,6 +112,30 @@
expect(widgetSpan.child, isInstanceOf<Container>());
},
);
+
+ testWidgets(
+ 'Custom rendering of tags without children',
+ (WidgetTester tester) async {
+ const String data = '![alt](/assets/images/logo.png)';
+ await tester.pumpWidget(
+ boilerplate(
+ Markdown(
+ data: data,
+ builders: <String, MarkdownElementBuilder>{
+ 'img': ImgBuilder(),
+ },
+ ),
+ ),
+ );
+
+ final Finder imageFinder = find.byType(Image);
+ expect(imageFinder, findsNothing);
+ final Finder textFinder = find.byType(Text);
+ expect(textFinder, findsOneWidget);
+ final Text textWidget = tester.widget(find.byType(Text));
+ expect(textWidget.data, 'foo');
+ },
+ );
}
class SubscriptSyntax extends md.InlineSyntax {
@@ -225,3 +249,10 @@
);
}
}
+
+class ImgBuilder extends MarkdownElementBuilder {
+ @override
+ Widget? visitElementAfter(md.Element element, TextStyle? preferredStyle) {
+ return Text('foo', style: preferredStyle);
+ }
+}