import 'package:flutter/widgets.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:markdown/markdown.dart' as md; /// Markdown widget which allows to set [maxLines], [softWrap] and [overflow]. class CustomMarkdownBody extends MarkdownWidget { const CustomMarkdownBody({ required String data, bool selectable = false, MarkdownStyleSheet? styleSheet, MarkdownStyleSheetBaseTheme? styleSheetTheme, SyntaxHighlighter? syntaxHighlighter, MarkdownTapLinkCallback? onTapLink, VoidCallback? onTapText, String? imageDirectory, List? blockSyntaxes, List? inlineSyntaxes, md.ExtensionSet? extensionSet, MarkdownImageBuilder? imageBuilder, MarkdownCheckboxBuilder? checkboxBuilder, Map builders = const {}, MarkdownListItemCrossAxisAlignment listItemCrossAxisAlignment = MarkdownListItemCrossAxisAlignment.baseline, this.shrinkWrap = true, bool fitContent = true, this.maxLines, this.overflow, this.softWrap = true, Key? key, }) : super( key: key, data: data, fitContent: fitContent, selectable: selectable, styleSheet: styleSheet, styleSheetTheme: styleSheetTheme, syntaxHighlighter: syntaxHighlighter, onTapLink: onTapLink, onTapText: onTapText, imageDirectory: imageDirectory, blockSyntaxes: blockSyntaxes, inlineSyntaxes: inlineSyntaxes, extensionSet: extensionSet, imageBuilder: imageBuilder, checkboxBuilder: checkboxBuilder, builders: builders, listItemCrossAxisAlignment: listItemCrossAxisAlignment, ); final TextOverflow? overflow; final int? maxLines; final bool softWrap; /// See [ScrollView.shrinkWrap] final bool shrinkWrap; T? _findWidgetOfType(Widget widget) { if (widget is T) { return widget as T; } if (widget is MultiChildRenderObjectWidget) { final multiChild = widget; for (final child in multiChild.children) { return _findWidgetOfType(child); } } else if (widget is SingleChildRenderObjectWidget) { return _findWidgetOfType(widget.child!); } return null; } @override Widget build(BuildContext context, List? children) { final richText = _findWidgetOfType(children!.first); if (richText != null) { return RichText( text: richText.text, textScaleFactor: richText.textScaleFactor, textAlign: richText.textAlign, maxLines: maxLines, overflow: overflow ?? TextOverflow.visible, softWrap: false, ); } return children.first; } }