Flutter富文本渲染插件markup_text_plus的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter富文本渲染插件markup_text_plus的使用

markup_text_plus

GitHub license Version

markup_text_plus 是一个用于在 Flutter 中轻松创建格式化文本的插件。它支持加粗、斜体、下划线、链接、颜色以及自定义标签。

特性

  • 支持自定义标签
  • 支持 TextSpan

使用方法

MarkupText 是一个包装了 RichText 的小部件,简化了具有混合样式的文本的创建。

MarkupText("This is a (b)Markup(/b) example with (c deepPurple)a purple text(/c)")

你也可以使用 MarkupTextSpan 来创建具有混合样式的 TextSpan

Text.rich(
  MarkupTextSpan(
    text: "This is a (b)Markup(/b) example with (c deepPurple)a purple text(/c)",
  ),
)

样式

style 参数用于定义文本的默认样式。你可以用它来定义默认字体大小、颜色等。

MarkupText(
  "This is a (b)bold(/b) text (a https://flutter.dev)with a link(/a),"
  " an (u)underlined(/u) word and (color ffff0000)colored(/color) words"
  " (color FF7C4DFF)here(/color) and (color FF4CAF50)there(/color).",
  style: MarkupTextStyle(
    textStyle: const TextStyle(fontSize: 20),
  ),
),

标签语言

以下标签被此插件识别:

加粗

使用 (b)..(/b) 标签来实现加粗文本。

MarkupText("This is a (b)bold(/b) text")
斜体

使用 (i)..(/i) 标签来实现斜体文本。

MarkupText("This is an (i)italic(/i) text")
下划线

使用 (u)..(/u) 标签来实现下划线文本。

MarkupText("This is an (u)underlined(/u) text")
链接

使用 (a <url>)..(/a) 标签来创建链接。

MarkupText("(a http://example.com)This is a link(/a)")
颜色

使用 (c <color>)..(/c) 标签来创建带颜色的文本。

MarkupText("(c ffff0000)Colors from ARGB codes(/c)")

完整示例

以下是完整的示例代码:

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

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

class App extends StatelessWidget {
  const App({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const MarkupText("(b)Markup(/b) (i)Example(/i)"),
        ),
        body: const Padding(
          padding: EdgeInsets.all(16),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              MarkupText(
                "This is a (b)bold(/b) text (a https://flutter.dev)with a link(/a),"
                " an (u)underlined(/u) word and (color ffff0000)colored(/color) words"
                " (color FF7C4DFF)here(/color) and (color FF4CAF50)there(/color).",
                style: MarkupTextStyle(
                  textStyle: TextStyle(fontSize: 20),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter中使用markup_text_plus插件来渲染富文本的示例代码。markup_text_plus是一个强大的插件,允许你使用类似于Markdown的语法来渲染富文本。

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

dependencies:
  flutter:
    sdk: flutter
  markup_text_plus: ^x.y.z  # 替换为最新版本号

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

接下来是一个完整的示例,展示如何使用markup_text_plus来渲染富文本:

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

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 示例文本,包含各种富文本元素
    String markupText = """
    # 这是一个标题
    
    这是一些**粗体**文本和*斜体*文本。
    
    这是一个[链接](https://www.example.com)。
    
    这是一个代码块:
    ```
    print("Hello, World!");
    ```
    
    这是一个列表:
    - 项目1
    - 项目2
    - 项目3
    
    这是一个引用块:
    > 这是一个引用文本。
    
    这是一个图片:
    ![Flutter Logo](https://flutter.dev/assets/images/flutter-lockup-1cb6a6.png)
    """;

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Markup Text Plus Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: MarkupTextPlus(
          markupText,
          styleBuilder: (context, MarkupStyle style) {
            // 根据不同的样式返回不同的TextStyle
            switch (style) {
              case MarkupStyle.heading1:
                return TextStyle(fontSize: 24, fontWeight: FontWeight.bold);
              case MarkupStyle.bold:
                return TextStyle(fontWeight: FontWeight.bold);
              case MarkupStyle.italic:
                return TextStyle(fontStyle: FontStyle.italic);
              case MarkupStyle.code:
                return TextStyle(backgroundColor: Colors.grey[200], fontFamily: 'monospace');
              case MarkupStyle.link:
                return TextStyle(color: Colors.blue, decoration: TextDecoration.underline);
              case MarkupStyle.blockquote:
                return TextStyle(color: Colors.grey, fontStyle: FontStyle.italic);
              case MarkupStyle.image:
                // 对于图片,我们需要返回一个Widget,而不是TextStyle
                return null;
              default:
                return TextStyle();
            }
          },
          imageBuilder: (context, String src) {
            // 构建并返回图片Widget
            return Image.network(src, width: 200, height: 200);
          },
          linkBuilder: (context, String url, String title, Map<String, String> attributes) {
            // 构建并返回可点击的链接Widget
            return GestureDetector(
              onTap: () {
                // 打开链接
                if (url.isNotEmpty) {
                  _launchURL(url);
                }
              },
              child: Text(
                title ?? url,
                style: TextStyle(color: Colors.blue, decoration: TextDecoration.underline),
              ),
            );
          },
        ),
      ),
    );
  }

  // 辅助方法:打开URL
  void _launchURL(String url) async {
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }
}

在这个示例中,我们:

  1. pubspec.yaml中添加了markup_text_plus依赖。
  2. 创建了一个Flutter应用,并在MyHomePage中使用了MarkupTextPlus来渲染包含各种富文本元素的字符串。
  3. 定义了styleBuilder来处理不同的文本样式。
  4. 定义了imageBuilder来处理图片。
  5. 定义了linkBuilder来处理可点击的链接。

你可以根据实际需求调整样式和逻辑。希望这个示例对你有帮助!

回到顶部