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

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

vivid_text 是一个强大的解决方案,用于基于文本生成“混合排版(文本与小部件的混合)”。

示例

// 定义标签列表
final List<VividTag> tags = [
    // 用户标签
    VividWidgetTag(
    name: 'user',
    builder: ((child, attributes) {
        final name = attributes['name'];
        return TextButton(
            onPressed: () {
            final user = getUserApi(int.parse(attributes['userid'] ?? '0'));
            Navigator.push(context, MaterialPageRoute(builder: (c) => UserPage(user)));
            },
            child: Text('$name', style: const TextStyle(fontSize: 18)));
    }),
    ),
    // 星星图标标签
    VividWidgetTag(
    name: 'star',
    builder: ((child, attributes) {
        return Icon(Icons.star, color: Colors.yellow[700]);
    }),
    ),
    // 时间标签
    VividTextTag(
    name: 'hoursToNow',
    builder: ((child, attributes) {
        final time = DateTime.fromMillisecondsSinceEpoch(int.parse(attributes['time']!));
        return TextSpan(text: '${time.hour}');
    }),
    ),
];

// 日志列表
final logs = [
    '<user userid="1" name="keysking"></user> 创建了这个库 <hoursToNow time="1656589103"></hoursToNow> 小时之前',
    '<user userid="2" name="Jobs"></user> <star></star> 这个库 <hoursToNow time="1656589103"></hoursToNow> 小时之前',
    '<user userid="1" name="keysking"></user> 创建了这个库 <hoursToNow time="1656589103"></hoursToNow> 小时之前',
];

// 使用VividText渲染日志
VividText(logs[index], tags: tags, style: const TextStyle(fontSize: 18))

完整示例代码

import 'package:flutter/material.dart';
import 'package:vivid_text/vivid_text.dart'; // 导入vivid_text包

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int index = 0;

  final List<VividTag> tags = [
    // 用户标签
    VividWidgetTag(
      name: 'user',
      builder: ((child, attributes) {
          final name = attributes['name'];
          return TextButton(
              onPressed: () {
              final user = getUserApi(int.parse(attributes['userid'] ?? '0'));
              Navigator.push(context, MaterialPageRoute(builder: (c) => UserPage(user)));
              },
              child: Text('$name', style: const TextStyle(fontSize: 18)));
      }),
    ),
    // 星星图标标签
    VividWidgetTag(
      name: 'star',
      builder: ((child, attributes) {
          return Icon(Icons.star, color: Colors.yellow[700]);
      }),
    ),
    // 时间标签
    VividTextTag(
      name: 'hoursToNow',
      builder: ((child, attributes) {
          final time = DateTime.fromMillisecondsSinceEpoch(int.parse(attributes['time']!));
          return TextSpan(text: '${time.hour}');
      }),
    ),
  ];

  final logs = [
    '<user userid="1" name="keysking"></user> 创建了这个库 <hoursToNow time="1656589103"></hoursToNow> 小时之前',
    '<user userid="2" name="Jobs"></user> <star></star> 这个库 <hoursToNow time="1656589103"></hoursToNow> 小时之前',
    '<user userid="1" name="keysking"></user> 创建了这个库 <hoursToNow time="1656589103"></hoursToNow> 小时之前',
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('VividText Demo')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                setState(() {
                  index = (index + 1) % logs.length;
                });
              },
              child: Text('切换日志'),
            ),
            SizedBox(height: 20),
            // 使用VividText渲染日志
            VividText(logs[index], tags: tags, style: const TextStyle(fontSize: 18)),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


vivid_text 是一个用于 Flutter 的富文本渲染插件,它允许开发者以更灵活的方式渲染带有不同样式和交互的文本内容。这个插件特别适用于需要在同一行或同一段文本中应用多种样式(如颜色、字体、背景、点击事件等)的场景。

安装 vivid_text

首先,你需要在 pubspec.yaml 文件中添加 vivid_text 依赖:

dependencies:
  flutter:
    sdk: flutter
  vivid_text: ^0.1.0  # 请查看最新版本

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

使用 vivid_text

vivid_text 的核心是 VividText 组件,它允许你通过 VividTextSpan 来定义富文本内容。每个 VividTextSpan 都可以自定义样式和交互。

基本使用

下面是一个简单的例子,展示了如何使用 vivid_text 来渲染带有不同样式的文本:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Vivid Text Example'),
        ),
        body: Center(
          child: VividText(
            spans: [
              VividTextSpan(
                text: 'Hello, ',
                style: TextStyle(
                  color: Colors.black,
                  fontSize: 24,
                ),
              ),
              VividTextSpan(
                text: 'Flutter',
                style: TextStyle(
                  color: Colors.blue,
                  fontSize: 24,
                  fontWeight: FontWeight.bold,
                ),
              ),
              VividTextSpan(
                text: '!',
                style: TextStyle(
                  color: Colors.black,
                  fontSize: 24,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个例子中,我们使用了三个 VividTextSpan,分别渲染了不同的文本样式。

添加交互

vivid_text 还支持为文本添加交互,例如点击事件。你可以通过 onTap 属性来定义点击事件:

VividText(
  spans: [
    VividTextSpan(
      text: 'Click ',
      style: TextStyle(
        color: Colors.black,
        fontSize: 24,
      ),
    ),
    VividTextSpan(
      text: 'here',
      style: TextStyle(
        color: Colors.blue,
        fontSize: 24,
        fontWeight: FontWeight.bold,
      ),
      onTap: () {
        print('Text clicked!');
      },
    ),
    VividTextSpan(
      text: ' to continue.',
      style: TextStyle(
        color: Colors.black,
        fontSize: 24,
      ),
    ),
  ],
)

在这个例子中,当用户点击 “here” 时,控制台会输出 “Text clicked!”。

自定义背景和装饰

你还可以为 VividTextSpan 添加背景颜色、边框等装饰:

VividText(
  spans: [
    VividTextSpan(
      text: 'Highlighted ',
      style: TextStyle(
        color: Colors.white,
        fontSize: 24,
      ),
      background: Colors.yellow,
    ),
    VividTextSpan(
      text: 'text',
      style: TextStyle(
        color: Colors.blue,
        fontSize: 24,
        fontWeight: FontWeight.bold,
      ),
      decoration: TextDecoration.underline,
    ),
  ],
)
回到顶部