Flutter Markdown渲染插件markdown_viewer的使用

Flutter Markdown渲染插件markdown_viewer的使用

Markdown Viewer

一个用于Flutter的Markdown查看器小部件。它可以将Markdown字符串渲染为富文本输出。

查看此截图的源代码 这里

使用方法

以下是一个简单的Markdown Viewer组件的使用示例:

MarkdownViewer(
  'Hello **Markdown**!',
  enableTaskList: true,
  enableSuperscript: false,
  enableSubscript: false,
  enableFootnote: false,
  enableImageSize: false,
  enableKbd: false,
  syntaxExtensions: const [],
  elementBuilders: const [],
);

如何创建语法扩展

下面是一个创建自定义语法扩展的示例:

class ExampleSyntax extends MdInlineSyntax {
  ExampleSyntax() : super(RegExp(r'#[^#]+?(?=\s+|$)'));

  [@override](/user/override)
  MdInlineObject? parse(MdInlineParser parser, Match match) {
    final markers = [parser.consume()];
    final content = parser.consumeBy(match[0]!.length - 1);

    return MdInlineElement(
      'example',
      markers: markers,
      children: content.map((e) => MdText.fromSpan(e)).toList(),
    );
  }
}

如何创建元素构建器

下面是一个创建自定义元素构建器的示例:

class ExampleBuilder extends MarkdownElementBuilder {
  ExampleBuilder()
      : super(
          textStyle: const TextStyle(
            color: Colors.green,
            decoration: TextDecoration.underline,
          ),
        );

  [@override](/user/override)
  bool isBlock(element) => false;

  [@override](/user/override)
  List<String> matchTypes = ['example'];
}

完整示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用Markdown Viewer组件:

// ignore_for_file: avoid_print

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_prism/flutter_prism.dart';
import 'package:markdown_viewer/markdown_viewer.dart';

import 'extension.dart';

const markdown = r'''
## Markdown example

Hello **Markdown**!

### Highlights

- [x] ==100%== conform to CommonMark.
- [x] ==100%== conform to GFM.
- [x] Easy to implement syntax **highlighting**, for example `flutter_prism`:
   ```dart
   // Dart language.
   void main() {
     print('Hello, World!');
   }
  • [x] Easy to custom, for example: > This is a #custom_extension

Dependencies

Name Required
dart_markdown Yes
flutter_prism No

‘’’;

void main() { runApp(const MyApp()); }

class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key);

@override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData.light(), darkTheme: ThemeData.dark(), title: ‘MarkdownViewer Demo’, debugShowCheckedModeBanner: false, home: const MyHomePage(), scrollBehavior: CustomScrollBehavior(), ); } }

class MyHomePage extends StatelessWidget { const MyHomePage({Key? key}) : super(key: key);

@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text(‘MarkdownViewer Demo’)), body: SingleChildScrollView( padding: const EdgeInsets.all(20), child: MarkdownViewer( markdown, enableTaskList: true, enableSuperscript: false, enableSubscript: false, enableFootnote: false, enableImageSize: false, enableKbd: false, syntaxExtensions: [ExampleSyntax()], highlightBuilder: (text, language, infoString) { final prism = Prism( mouseCursor: SystemMouseCursors.text, style: Theme.of(context).brightness == Brightness.dark ? const PrismStyle.dark() : const PrismStyle(), ); return prism.render(text, language ?? ‘plain’); }, onTapLink: (href, title) { print({href, title}); }, elementBuilders: [ ExampleBuilder(), ], styleSheet: const MarkdownStyle( listItemMarkerTrailingSpace: 12, codeSpan: TextStyle( fontFamily: ‘RobotoMono’, ), codeBlock: TextStyle( fontSize: 14, letterSpacing: -0.3, fontFamily: ‘RobotoMono’, ), ), ), ), ); } }

class CustomScrollBehavior extends MaterialScrollBehavior { @override Set<PointerDeviceKind> get dragDevices => { PointerDeviceKind.touch, PointerDeviceKind.mouse, }; }


更多关于Flutter Markdown渲染插件markdown_viewer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Markdown渲染插件markdown_viewer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用markdown_viewer插件来渲染Markdown内容的示例代码。这个示例将展示如何集成markdown_viewer插件并渲染一个简单的Markdown字符串。

首先,确保你已经在pubspec.yaml文件中添加了markdown_viewer依赖:

dependencies:
  flutter:
    sdk: flutter
  markdown_viewer: ^0.5.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用MarkdownViewer小部件来渲染Markdown内容。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:markdown_viewer/markdown_viewer.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Markdown Viewer Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MarkdownViewerScreen(),
    );
  }
}

class MarkdownViewerScreen extends StatelessWidget {
  final String markdownData = """
# 这是一个标题

这是一些普通的文本。

- 列表项1
- 列表项2
- 列表项3

```dart
void main() {
  print('Hello, World!');
}

这是一个链接

这是一张图片 “”";

@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(‘Markdown Viewer Demo’), ), body: Padding( padding: const EdgeInsets.all(16.0), child: MarkdownViewer( markdownData: markdownData, styleSheet: MarkdownStyleSheet( h1: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), p: TextStyle(fontSize: 16), codeBlock: TextStyle(fontSize: 14, backgroundColor: Colors.grey[200]), a: TextStyle(color: Colors.blue, decoration: TextDecoration.underline), img: ImageStyle(width: double.infinity), ), ), ), ); } }


在这个示例中,我们做了以下几件事情:

1. 在`pubspec.yaml`文件中添加了`markdown_viewer`依赖。
2. 创建了一个`MyApp`类作为应用的入口。
3. 创建了一个`MarkdownViewerScreen`类,它包含了一些Markdown内容,并使用`MarkdownViewer`小部件来渲染这些内容。
4. 在`MarkdownViewer`小部件中,我们还提供了一个自定义的`MarkdownStyleSheet`来自定义Markdown内容的样式。

运行这个示例代码,你应该能够看到一个包含标题、文本、列表、代码块、链接和图片的Markdown内容被成功渲染在Flutter应用中。
回到顶部