Flutter文本处理插件wx_text的使用

Flutter文本处理插件wx_text的使用

Text小部件是Flutter的基本组件之一,但有时你希望对文本呈现有更多的控制。wx_text插件提供了强大的功能,为你的Flutter文本体验注入了超级能力。

预览

功能

  • 无缝集成:基于标准的Text小部件构建,继承了所有功能,包括文本内容、样式和文本方向,使开发人员可以轻松过渡。
  • 轻松预定义样式:提供常用的样式构造函数,如标题、正文和字幕。还允许通过回调函数进行完全自定义。
  • 最小行数:定义小部件将始终显示的最小行数,确保一致的外观并防止出现空白空间。
  • 文本高亮:允许用户选择和高亮特定部分的文本以强调或注释。高亮文本可以通过颜色自定义来区分。
  • 文本变换:利用正则表达式来针对特定模式(如URL或电子邮件地址)。将其转换为可点击元素或自定义生成器,创建更具交互性和用户友好的体验。
  • 剧透文本:实现一种动态展开/折叠机制,由用户交互或特定触发器控制。
  • 动画文本:允许添加吸引人的动画,如滑动、缩放、闪烁、摇晃、淡入淡出甚至打字效果。吸引用户的注意力,增强视觉吸引力,并以更动态的方式讲述你的故事。
  • 轮廓和渐变:超越基本样式,通过可定制的轮廓和引人注目的渐变创建视觉上引人注目的文本。

使用

要详细了解如何使用wx_text,请查看Medium上的文章:增强你的Flutter文本小部件。该指南展示了实用的代码示例,并演示了如何利用wx_text的各种功能。

要深入了解wx_text类、方法和属性的技术细节,请参阅官方API文档

示例代码

以下是一个完整的示例,展示了如何使用wx_text插件:

/* spell-checker: disable */

import 'package:flutter/material.dart';
import 'package:wx_text/wx_text.dart';
import 'package:url_launcher/url_launcher.dart';

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

Future<void> openURL(String url) async {
  final Uri uri = Uri.parse(url);
  if (!await launchUrl(uri)) {
    throw Exception('Could not launch $uri');
  }
}

Future<void> sendMail(String address) async {
  final Uri uri = Uri.parse('mailto:$address');
  if (!await launchUrl(uri)) {
    throw Exception('Could not send mail $uri');
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Wx Text Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Wx Text Demo'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Wrapper(
      children: [
        ListTile(
          title: const WxText.displayLarge(
            'WxText',
            fontWeight: FontWeight.bold,
            outlineColor: Colors.white,
            outlineWidth: 1.5,
            shadows: [
              Shadow(
                color: Colors.green,
                blurRadius: 3,
              ),
            ],
            gradient: LinearGradient(
              colors: [
                Colors.green,
                Colors.blue,
              ],
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
            ),
          ),
          subtitle: WxAnimatedText(
            duration: const Duration(milliseconds: 2500),
            transition: WxAnimatedText.shimmer(
              colors: [
                Colors.black87,
                Colors.red,
                Colors.amber,
                Colors.black87,
                Colors.black87,
              ],
              stops: [0.0, 0.35, 0.5, 0.65, 1.0],
            ),
            child: const WxText.bodyLarge(
              'A powerful widget that builds upon the familiar Flutter Text widget',
            ),
          ),
          contentPadding: EdgeInsets.zero,
        ),
        const SizedBox(height: 20),
        const Example(
          title: 'Typography with Ease',
          child: WxTextStyler(
            variant: WxTextVariant.bodyLarge,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                WxText(
                    'This text inherits its formatting from its WxStyler parent widget.'),
                SizedBox(height: 20),
                WxText.titleMedium(
                    'The WxText.titleMedium constructor defines the style of this text.'),
                SizedBox(height: 20),
                WxText(
                  'This text uses a large label style by setting the variant parameter to WxTextVariant.labelLarge.',
                  variant: WxTextVariant.labelLarge,
                ),
              ],
            ),
          ),
        ),
        const SizedBox(height: 20),
        Example(
          title: 'Min Lines',
          child: WxText.labelLarge(
            'Text with a minimum of 3 lines',
            minLines: 3,
            minLinesDebugColor: Colors.yellow.shade200,
          ),
        ),
        const SizedBox(height: 20),
        const Example(
          title: 'Gradient Text',
          child: WxText.headlineSmall(
            'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
            gradient: LinearGradient(colors: [
              Colors.green,
              Colors.blue,
              Colors.red,
            ]),
            fontWeight: FontWeight.bold,
          ),
        ),
        const SizedBox(height: 20),
        const Example(
          title: 'Outlined Text',
          child: WxText.headlineSmall(
            'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
            color: Colors.white,
            fontWeight: FontWeight.bold,
            outlineColor: Colors.black87,
            outlineWidth: 1.5,
            letterSpacing: 1.1,
          ),
        ),
        const SizedBox(height: 20),
        Example(
          title: 'Parse Special Text',
          child: WxText(
            'Enhanced text processing with email and URL converted to clickable links, and  highlighted text\n\n'
            'https://pub.dev/packages/wx_text\n'
            'https://pub.dev/publishers/widgetarian.com\n'
            'davigmacode@gmail.com',
            highlight: 'highlighted',
            textAlign: TextAlign.justify,
            filter: [
              WxTextFilter.highlight(
                search: 'email',
                style: TextStyle(
                  backgroundColor: Colors.lightBlue.shade200,
                ),
              ),
              WxTextFilter.highlight(
                search: 'url',
                style: TextStyle(
                  backgroundColor: Colors.red.shade200,
                ),
              ),
              WxTextFilter.highlight(
                search: 'clickable',
                style: TextStyle(
                  backgroundColor: Colors.green.shade200,
                ),
              ),
              WxTextFilter.email(onTap: sendMail),
              WxTextFilter.url(onTap: openURL),
            ],
          ),
        ),
        const SizedBox(height: 20),
        Example(
          title: 'Text expansion/collapse',
          child: WxSpoilerText(
            'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n'
            'https://pub.dev/packages/wx_text\n'
            'https://pub.dev/publishers/widgetarian.com\n'
            'davigmacode@gmail.com',
            highlight: 'do',
            maxLines: 5,
            textAlign: TextAlign.justify,
            filterDisabledOnCollapsed: true,
            filter: [
              WxTextFilter.email(onTap: sendMail),
              WxTextFilter.url(onTap: openURL),
            ],
            wrapper: (context, text, toggle) {
              return InkWell(
                splashFactory: NoSplash.splashFactory,
                onTap: toggle,
                child: text,
              );
            },
          ),
        ),
        const SizedBox(height: 20),
        Example(
          title: 'Animated Text',
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const WxAnimatedText(
                curve: Curves.bounceOut,
                delay: Duration(milliseconds: 300),
                duration: Duration(milliseconds: 1000),
                transition: WxAnimatedText.shakeX,
                child: Text(
                  'Lorem ipsum dolor sit amet',
                  style: TextStyle(
                    color: Colors.red,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
              const SizedBox(height: 20),
              WxAnimatedText(
                curve: Curves.linear,
                delay: const Duration(milliseconds: 300),
                duration: const Duration(milliseconds: 1000),
                transition: WxAnimatedText.shimmer(colors: [
                  Colors.black87,
                  Colors.white,
                  Colors.black87,
                  Colors.black87,
                ]),
                child: const WxText.titleMedium(
                  'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua',
                ),
              ),
              const SizedBox(height: 20),
              const TypingText(),
            ],
          ),
        ),
        const SizedBox(height: 20),
      ],
    );
  }
}

class TypingText extends StatefulWidget {
  const TypingText({super.key});

  [@override](/user/override)
  State<TypingText> createState() => _TypingTextState();
}

class _TypingTextState extends State<TypingText> {
  final key = GlobalKey<WxAnimatedTextState>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.min,
      children: [
        WxAnimatedText(
          key: key,
          repeat: 0,
          mirror: true,
          reverse: true,
          curve: Curves.linear,
          delay: const Duration(milliseconds: 300),
          duration: const Duration(milliseconds: 1000),
          reverseDelay: const Duration(milliseconds: 300),
          reverseDuration: const Duration(milliseconds: 7000),
          transition: WxAnimatedText.typing(trails: '_'),
          child: const WxText(
            'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua',
            variant: WxTextVariant.titleLarge,
            gradient: LinearGradient(colors: [
              Colors.blue,
              Colors.red,
              Colors.amber,
            ]),
          ),
        ),
        const SizedBox(height: 20),
        OutlinedButton(
          onPressed: () => key.currentState?.play(reset: true),
          child: const WxText('ReTyping Text'),
        ),
      ],
    );
  }
}

class Wrapper extends StatelessWidget {
  const Wrapper({
    super.key,
    required this.children,
  });

  final List<Widget> children;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        padding: const EdgeInsets.symmetric(vertical: 30, horizontal: 20.0),
        child: Center(
          child: ConstrainedBox(
            constraints: const BoxConstraints(maxWidth: 400),
            child: SizedBox(
              width: double.infinity,
              child: Column(
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: children,
              ),
            ),
          ),
        ),
      ),
    );
  }
}

class Example extends StatelessWidget {
  const Example({
    super.key,
    required this.title,
    required this.child,
  });

  final String title;
  final Widget child;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.min,
      children: [
        Padding(
          padding: const EdgeInsets.fromLTRB(10, 0, 0, 0),
          child: WxText.labelLarge(title),
        ),
        Card.outlined(
          child: SizedBox(
            width: double.infinity,
            child: Padding(
              padding: const EdgeInsets.all(15.0),
              child: child,
            ),
          ),
        ),
      ],
    );
  }
}

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

1 回复

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


在Flutter中处理文本时,使用第三方插件可以大大简化开发流程。wx_text 是一个假想的文本处理插件(请注意,在实际 Flutter 生态系统中,并没有一个广泛认知的名为 wx_text 的插件,这里我将基于一个假设的文本处理插件的功能来编写代码示例)。假设 wx_text 插件提供了文本格式化、高亮显示和文本验证等功能。

以下是如何在 Flutter 项目中使用 wx_text 插件的假设代码示例(请注意,实际使用时需要根据插件的真实API进行调整):

  1. 添加依赖: 首先,在 pubspec.yaml 文件中添加 wx_text 插件的依赖(假设该插件存在):

    dependencies:
      flutter:
        sdk: flutter
      wx_text: ^1.0.0  # 假设版本号
    

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

  2. 导入插件: 在你的 Dart 文件中导入 wx_text 插件:

    import 'package:wx_text/wx_text.dart';
    
  3. 使用插件功能

    • 文本格式化: 假设 wx_text 提供了一个 formatText 方法来格式化文本。

      void main() {
        runApp(MyApp());
      }
      
      class MyApp extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
          return MaterialApp(
            home: Scaffold(
              appBar: AppBar(
                title: Text('Text Formatting Example'),
              ),
              body: Center(
                child: Text(
                  formatText('Hello, **world**! This is some *italic* text.'),
                  style: TextStyle(fontSize: 24),
                ),
              ),
            ),
          );
        }
      
        String formatText(String input) {
          // 假设 wx_text 插件提供了一个格式化方法
          // 这里我们模拟一个简单的 Markdown 风格的格式化
          return input.replaceAll('**', '**').replaceAll('*', '*'); 
          // 注意:这里只是模拟,实际插件会有更复杂的实现
        }
      }
      

      注意:上面的 formatText 方法只是模拟了插件的功能,实际插件可能会提供更复杂的文本格式化功能。

    • 文本高亮显示: 假设 wx_text 提供了一个 highlightText 方法来高亮显示特定关键词。

      String highlightText(String input, List<String> keywords) {
        // 这里模拟高亮显示关键词,实际插件会有更高效的实现
        String result = input;
        for (var keyword in keywords) {
          result = result.replaceAllMapped(
            RegExp(RegExp.escape(keyword), caseSensitive: false),
            (match) => '<span style="background-color: yellow;">${match[0]}</span>',
          );
        }
        // 注意:Flutter Text widget 不直接支持 HTML,这里只是为了演示
        return result; // 实际使用时需要转换为 Flutter 可渲染的 Widget
      }
      
      // 在 UI 中使用(注意:这里需要额外的逻辑来将 HTML 转换为 Widget)
      // 例如,可以使用 `flutter_html` 插件来渲染 HTML 格式的字符串
      

      注意:Flutter 原生不支持直接从 HTML 渲染文本,你可以使用 flutter_html 或其他第三方插件来实现这一功能。

    • 文本验证: 假设 wx_text 提供了一个 validateText 方法来验证文本是否符合特定规则。

      bool validateText(String input) {
        // 这里模拟一个简单的验证规则,例如检查文本是否包含特定字符
        // 实际插件会有更复杂的验证逻辑
        return input.contains('@'); // 例如,检查是否包含电子邮件地址的 '@' 符号
      }
      
      // 在 UI 中使用验证功能
      void _validateAndShowResult() {
        String input = "example@email.com";
        bool isValid = validateText(input);
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(isValid ? 'Text is valid' : 'Text is invalid'),
          ),
        );
      }
      

请注意,上面的代码示例是基于假设的 wx_text 插件的功能编写的,实际使用时需要根据插件的真实 API 文档进行调整。如果你正在寻找一个具体的文本处理插件,可以考虑在 Flutter 的 pub.dev 网站上搜索相关的文本处理或格式化插件。

回到顶部