シンプルで使いやすいマークダウンレンダリングコンポーネント。
- 見出しを通じてTOC(目次)機能をサポートし、迅速な位置決めが可能
- コードのハイライトをサポート
- すべてのプラットフォームをサポート
始める前に、デモをクリックしてオンラインデモを試すことができます。
import 'package:flutter/material.dart';
import 'package:markdown_widget/markdown_widget.dart';
class MarkdownPage extends StatelessWidget {
final String data;
MarkdownPage(this.data);
@override
Widget build(BuildContext context) => Scaffold(body: buildMarkdown());
Widget buildMarkdown() => MarkdownWidget(data: data);
}
独自のColumnや他のリストウィジェットを使用したい場合は、MarkdownGeneratorを使用できます。
Widget buildMarkdown() =>
Column(children: MarkdownGenerator().buildWidgets(data));
またはMarkdownBlockを使用します。
Widget buildMarkdown() =>
SingleChildScrollView(child: MarkdownBlock(data: data));
高度な使用例については、リポジトリの example/lib/markdown_custom フォルダを参照してください:
- video.dart - カスタムvideoタグのサポート
- latex.dart - LaTeX数式レンダリング
- mermaid.dart - Mermaid図のサポート(フローチャート、シーケンス図など)
- html_support.dart - HTMLタグの拡張
- custom_node.dart - カスタムノードの実装例
これらの例は、カスタムタグと機能を使用してパッケージを拡張する方法を示しています。
markdown_widgetはデフォルトでナイトモードをサポートしています。異なるMarkdownConfigを使用するだけで有効にできます。
Widget buildMarkdown(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark;
final config = isDark
? MarkdownConfig.darkConfig
: MarkdownConfig.defaultConfig;
final codeWrapper = (child, text, language) =>
CodeWrapperWidget(child, text, language);
return MarkdownWidget(
data: data,
config: config.copy(configs: [
isDark
? PreConfig.darkConfig.copy(wrapper: codeWrapper)
: PreConfig().copy(wrapper: codeWrapper)
]));
}
| デフォルトモード | ナイトモード |
|---|---|
![]() |
![]() |
リンクのスタイルとクリックイベントをカスタマイズできます。例えば次のように
Widget buildMarkdown() => MarkdownWidget(
data: data,
config: MarkdownConfig(configs: [
LinkConfig(
style: TextStyle(
color: Colors.red,
decoration: TextDecoration.underline,
),
onTap: (url) {
///TODO:on tap
},
)
]));
TOCの使用は非常に簡単です。
final tocController = TocController();
Widget buildTocWidget() => TocWidget(controller: tocController);
Widget buildMarkdown() => MarkdownWidget(data: data, tocController: tocController);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Row(
children: <Widget>[
Expanded(child: buildTocWidget()),
Expanded(child: buildMarkdown(), flex: 3)
],
));
}
コードのハイライトは複数のテーマをサポートしています。
import 'package:flutter_highlight/themes/a11y-light.dart';
Widget buildMarkdown() => MarkdownWidget(
data: data,
config: MarkdownConfig(configs: [
PreConfig(theme: a11yLightTheme),
]));
全プラットフォームで全選択とコピー機能をサポートしています。
現在のパッケージはMarkdownタグの変換のみを実装しているため、デフォルトではHTMLタグの変換をサポートしていません。ただし、この機能は拡張によってサポートできます。詳細については、html_support.dartの使用方法を参照してください。
こちらがオンラインHTMLデモショーケースです。
例にはLaTeXの簡単なサポートも含まれており、latex.dartの実装を参照することで実装できます。
こちらがオンラインlatexデモショーケースです。
例にはMermaid図のサポートが含まれており、フローチャート、シーケンス図、状態図などをレンダリングできます。実装についてはmermaid.dartを参照してください。
機能:
- 複数の図タイプ(フローチャート、シーケンス図、状態図、ER図など)
- テーマサポート(自動ライト/ダークモード)
- インタラクティブな表示モード(コードのみ、図のみ、または両方)
- フルスクリーンビューア(パンとズームをサポート)
- 幅の広い図の独立した水平スクロール
- パフォーマンス最適化のためのスマートキャッシュとデバウンス
こちらがオンラインMermaidデモショーケースです。
import 'package:markdown_widget/markdown_widget.dart';
import 'markdown_custom/mermaid.dart';
// 基本的な使い方
final isDark = Theme.of(context).brightness == Brightness.dark;
final preConfig = PreConfig(
wrapper: createMermaidWrapper(
config: const MermaidConfig(),
isDark: isDark,
preConfig: preConfig,
),
);
MarkdownWidget(
data: markdown,
config: config.copy(configs: [preConfig]),
)
// カスタム設定
final preConfig = PreConfig(
wrapper: createMermaidWrapper(
config: MermaidConfig(
displayMode: MermaidDisplayMode.codeAndDiagram,
diagramPadding: EdgeInsets.all(16.0),
showLoadingIndicator: true,
),
isDark: isDark,
preConfig: preConfig,
),
);MarkdownGeneratorConfigにSpanNodeGeneratorWithTagを渡すことで、新しいタグとそのタグに対応するSpanNodeを追加できます。また、既存のタグを使用して対応するSpanNodeを上書きすることもできます。
また、InlineSyntaxとBlockSyntaxを使用してMarkdown文字列の解析ルールをカスタマイズし、新しいタグを生成することもできます。
カスタムタグの実装方法については、このissueを参照してください。
このパッケージを使用していて、良いアイデアや提案がある場合、または問題がある場合は、プルリクエストやissueを開いてください。
markdown_widgetで使用されている他のライブラリは次のとおりです。
| パッケージ | 説明 |
|---|---|
| markdown | マークダウンデータの解析 |
| flutter_highlight | コードのハイライト |
| highlight | コードのハイライト |
| url_launcher | リンクのオープン |
| visibility_detector | ウィジェットの可視性のリスニング |
| scroll_to_index | ListViewがインデックスにジャンプできるようにする |



