Flutter HTML内容渲染插件html_to_flutter的使用

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

Flutter HTML内容渲染插件 html_to_flutter 的使用

html_to_flutter 是一个用于将原始HTML字符串转换为Flutter小部件的包。它支持多种HTML标签,并且可以通过额外的包扩展以支持更复杂的标签,如表格和iframe。

Live Preview

您可以在以下链接查看 html_to_flutter 包的实际效果:Live Demo

Features

  • 将HTML元素转换为Flutter小部件。
  • 支持文本格式(粗体、斜体、下划线、删除线)。
  • 支持链接、列表、图像和表格。
  • 可通过附加包扩展以支持更复杂的HTML元素。

Installation

pubspec.yaml 文件中添加 html_to_flutter 依赖:

dependencies:
  html_to_flutter: ^1.0.0

然后运行 flutter pub get 安装该包。

Usage

以下是使用 html_to_flutter 包的完整示例:

import 'package:flutter/material.dart';
import 'package:html_to_flutter/html_to_flutter.dart';
import 'package:html_to_flutter_table/html_to_flutter_table.dart'; // Example extension

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('HTML to Flutter Demo'),
        ),
        body: Html(
          config: HtmlConfig(
            onTap: (url, [attributes, element]) {
              print('Tapped on $url');
              print('Attributes: $attributes');
              print('Element: $element');
            },
            extensions: [
              const TableExtension(),
            ],
          ),
          renderMode: RenderMode.list,
          data: """
            <div>
              <h1>Hello, Flutter!</h1>
              <p>This is a sample HTML content converted to Flutter widgets.</p>
              <p>It supports <strong>bold</strong>, <em>italic</em>, <u>underline</u>, <strike>strike</strike>, and <a href="https://flutter.dev">links</a>.</p>
              <p>It supports ordered and unordered lists:</p>
              <ul>
                <li>Item 1</li>
                <li>Item 2</li>
                <li>Item 3</li>
              </ul>
              <ol>
                <li>Item 1</li>
                <li>Item 2</li>
                <li>Item 3</li>
              </ol>
              <p>It supports images:</p>
              <span>
                <img src="https://via.placeholder.com/100" height="100" />
                <img src="https://via.placeholder.com/100" height="100" />
                <img src="https://via.placeholder.com/100" height="100" />
              </span>
              <p>It supports tables:</p>
              <table>
                <thead>
                  <tr>
                    <th>Header 1</th>
                    <th>Header 2</th>
                    <th>Header 3</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td>Row 1, Cell 1</td>
                    <td>Row 1, Cell 2</td>
                    <td>Row 1, Cell 3</td>
                  </tr>
                  <tr>
                    <td>Row 2, Cell 1</td>
                    <td>Row 2, Cell 2</td>
                    <td>Row 2, Cell 3</td>
                  </tr>
                  <tr>
                    <td>Row 3, Cell 1</td>
                    <td>Row 3, Cell 2</td>
                    <td>Row 3, Cell 3</td>
                  </tr>
                </tbody>
              </table>
            </div>
          """,
        ),
      ),
    );
  }
}

示例代码 - 使用 html_to_flutter_kit

import 'dart:developer';

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late String _input = "";

  @override
  void initState() {
    super.initState();
    _input = """<div>
              <h1 color="red">Hello, Flutter!</h1>
              <p>This is a sample HTML content converted to Flutter widgets.</p>
              <p>It supports <strong>bold</strong>, <em>italic</em>, <u>underline</u>, <strike>strike</strike>, and <a href="https://flutter.dev">links</a>.</p>
              <p>It supports ordered and unordered lists:</p>
              <ul>
                <li color="#ff0000">Item 1</li>
                <li color="hsl(0, 100%, 50%)">Item 2</li>
                <li color="rgb(255,0,0)">Item 3</li>
              </ul>
              <ol>
                <li style="color:">Item 1</li>
                <li>Item 2</li>
                <li>Item 3</li>
              </ol>
              <p>It supports images:</p>
              <span>
                <img src="https://via.placeholder.com/100" height="100" />
                <img src="https://via.placeholder.com/100" height="100" />
                <img src="https://via.placeholder.com/100" height="100" />
              </span>
              <p>It supports tables:</p>
              <table>
                <thead>
                  <tr>
                    <th>Header 1</th>
                    <th>Header 2</th>
                    <th>Header 3</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td>Row 1, Cell 1</td>
                    <td>Row 1, Cell 2</td>
                    <td>Row 1, Cell 3</td>
                  </tr>
                  <tr>
                    <td>Row 2, Cell 1</td>
                    <td>Row 2, Cell 2</td>
                    <td>Row 2, Cell 3</td>
                  </tr>
                  <tr>
                    <td>Row 3, Cell 1</td>
                    <td>Row 3, Cell 2</td>
                    <td>Row 3, Cell 3</td>
                  </tr>
                </tbody>
              </table>
            </div>""";
    if (mounted) setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    final htmlConfig = HtmlConfig(
      onTap: (url, [attributes, element]) {
        log('Tapped on $url');
        log('Attributes: $attributes');
        log('Element: $element');
      },
      extensions: const [
        TableExtension(),
        IframeExtextion(),
      ],
      styleOverrides: {
        'h1': Style(
          margin: Spacing.px(top: 30),
          textStyle: const TextStyle(fontSize: 24),
        ),
        'p': Style(
          margin: Spacing.px(top: 10, bottom: 20),
          textStyle: const TextStyle(fontSize: 16),
        ),
        'ul': Style(
          margin: Spacing.px(top: 10, bottom: 10),
          padding: Spacing.px(left: 20),
        ),
        'ol': Style(
          margin: Spacing.px(top: 10, bottom: 10),
          padding: Spacing.px(left: 20),
        ),
      },
    );
    return Scaffold(
      body: LayoutBuilder(
        builder: (context, constraints) {
          if (constraints.maxWidth > 600) {
            return Row(
              children: [
                Expanded(
                  child: SingleChildScrollView(
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        const Padding(
                          padding: EdgeInsets.all(8.0),
                          child: Text(
                            'Enter HTML content below:',
                            style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                          ),
                        ),
                        TextFormField(
                          initialValue: _input,
                          onChanged: (value) {
                            _input = value;
                            if (mounted) setState(() {});
                          },
                          maxLines: 100,
                          decoration: const InputDecoration(
                            hintText: 'Enter HTML here',
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
                const VerticalDivider(
                  thickness: 5,
                ),
                Expanded(
                  child: Column(
                    children: [
                      Expanded(
                        child: Html(
                          config: htmlConfig,
                          renderMode: RenderMode.list,
                          data: _input,
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            );
          } else {
            return const Center(
              child: Text(
                'Please rotate your device to landscape mode.'
                'Or use a device with a larger screen.',
                textAlign: TextAlign.center,
              ),
            );
          }
        },
      ),
    );
  }
}

Extensibility

html_to_flutter 包可以通过以下子包进行扩展:

  • html_to_flutter_table:支持渲染HTML表格,包括 colspanrowspan
  • html_to_flutter_iframe:使用 flutter_inappwebview 包支持渲染HTML iframe。
  • html_to_flutter_kit:捆绑所有可用的子包,方便使用。

License

该项目基于MIT许可证发布,请参阅 LICENSE 文件了解详细信息。

注意:html_to_flutter 包及其子包目前处于开发阶段,可能会遇到一些问题或不完整的功能。欢迎反馈和贡献以帮助改进这些包。


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

1 回复

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


当然,html_to_flutter 是一个用于在 Flutter 应用中渲染 HTML 内容的插件。虽然它可能不如 flutter_html 那样广泛使用和更新频繁,但如果你特定需要这个插件,这里是一个基本的用法示例。

首先,确保在你的 pubspec.yaml 文件中添加依赖项:

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

然后,运行 flutter pub get 来获取依赖项。

接下来是一个简单的 Flutter 应用示例,展示如何使用 html_to_flutter 插件来渲染 HTML 内容:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('HTML to Flutter Example'),
        ),
        body: Center(
          child: HtmlWidget(
            htmlData: """
              <h1>Hello, World!</h1>
              <p>This is a paragraph with some <strong>bold</strong> and <em>italic</em> text.</p>
              <ul>
                <li>Item 1</li>
                <li>Item 2</li>
                <li>Item 3</li>
              </ul>
              <img src="https://via.placeholder.com/150" alt="Placeholder Image" />
            """,
          ),
        ),
      ),
    );
  }
}

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

  1. 导入必要的包

    • package:flutter/material.dart:Flutter 的基础 UI 库。
    • package:html_to_flutter/html_to_flutter.darthtml_to_flutter 插件。
  2. 创建主应用

    • MyApp 类继承自 StatelessWidget
    • build 方法中,我们返回一个 MaterialApp,其中包含一个 ScaffoldScaffold 包含一个 AppBar 和一个 Center 组件。
    • Center 组件中包含一个 HtmlWidget,它接收一个 htmlData 属性,该属性包含需要渲染的 HTML 内容。
  3. HTML 内容

    • htmlData 包含了一些简单的 HTML 标记,包括标题、段落、列表和图片。

请注意,html_to_flutter 插件可能不支持所有 HTML 标签和样式,具体支持情况需要参考该插件的文档或源代码。此外,由于插件的更新频率和社区支持可能不如 flutter_html,因此在选择插件时请权衡利弊。

如果你发现 html_to_flutter 无法满足你的需求,可以考虑使用更广泛支持的 flutter_html 插件。

回到顶部