Flutter文本格式化插件formatted_text_hooks的使用

Flutter文本格式化插件formatted_text_hooks的使用

介绍

  • Formatted Text 是一个用于文本格式化的包。
  • 可以用多个模式来包裹一段文本,从而应用多种合并在一起的 TextStyles。(所有 TextStyles 应该能够合并在一起)
  • 子模式可以应用于子字符串,并且它们会与父模式样式合并。(所有 TextStyles 应该能够合并在一起)
  • 这个包包含:
    • 文本视图
    • 文本编辑控制器
    • 选择工具栏

  • formatted_text - Formatted Text Package
  • formatted_text_hooks - Formatted Text Hooks Package

开始使用

添加依赖

pubspec.yaml 文件中添加依赖:

dependencies:
  formatted_text_hooks: [latest-version]

导入包

导入 formatted_text_hooks 包:

import 'package:formatted_text_hooks/formatted_text_hooks.dart';

使用示例

文本视图

加粗
FormattedText('*This text is bold*');

加粗文本

斜体
FormattedText('_This text is Italic_');

斜体文本

多样式子字符串

FormattedText('_This is *Bold Italic* Italic_');

多样式子字符串

文本编辑控制器

创建一个 FormattedTextEditingController

final textEditingController = FormattedTextEditingController();

如果使用 flutter_hooks,可以这样创建:

final textEditingController = useFormattedTextController();

自定义格式化器

自定义格式化器将覆盖默认格式化器。

FormattedText(
  '==This text is orange==',
  formatters: [
    ... FormattedTextDefaults.formattedTextDefaultFormatters, // 添加默认格式化器
    FormattedTextFormatter(
      patternChars: '==', // 模式字符
      style: TextStyle(color: Colors.orange),
    )
  ],
)

上下文菜单构建器

获取适应性文本选择工具栏并带有默认格式化器菜单项:

contextMenuBuilder: (BuildContext context, EditableTextState editableTextState) {
  return FormattedTextContextMenuBuilder.adaptiveTextSelectionToolbar(
    editableTextState: editableTextState,
  );
}

自定义上下文菜单构建器项

自定义菜单项将覆盖默认格式化器项。

contextMenuBuilder: (BuildContext context, EditableTextState editableTextState) {
  return FormattedTextContextMenuBuilder.adaptiveTextSelectionToolbar(
    editableTextState: editableTextState,
    items: [
      ...FormattedTextDefaults.formattedTextDefaultContextMenuItems, // 默认格式化器
      const FormattedTextContextMenuItem(
        label: 'Orange',
        patternChars: '==',
      ),
    ],
  );
},

或者,使用上下文菜单按钮项:

contextMenuBuilder: (BuildContext context, EditableTextState editableTextState) {
  return AdaptiveTextSelectionToolbar.buttonItems(
    anchors: editableTextState.contextMenuAnchors,
    buttonItems: [
      ...editableTextState.contextMenuButtonItems,
      ...FormattedTextDefaults.formattedTextDefaultContextMenuButtonItems(editableTextState),
      FormattedTextContextMenuBuilder.buildContextMenuButtonItem(
        editableTextState: editableTextState,
        item: const FormattedTextContextMenuItem(
          label: 'Orange',
          patternChars: '==',
        ),
      ),
    ],
  );
}

选择控制

要显示自定义选择控制:

selectionControls: FormattedTextSelectionControls(),

修改剪切、复制、粘贴和全选操作的可用性使用 Toolbar Options

toolbarOptions: ToolbarOptions(
  cut: false,
  copy: false,
  paste: false,
  selectAll: true,
)

自定义格式化器 - 橙色文本

自定义工具栏动作

提供自定义动作将覆盖默认动作(除了剪切、复制、粘贴和全选)。

selectionControls: FormattedTextSelectionControls(
  actions: [
    ... FormattedTextDefaults.formattedTextToolbarDefaultActions, // 添加默认动作
    FormattedTextToolbarAction(
      label: 'Orange',
      patternChars: '==',
    )
  ],
)

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用formatted_text_hooks插件来进行文本格式化的代码示例。formatted_text_hooks插件允许你以灵活的方式格式化文本,包括应用不同的样式、颜色等。

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

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

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

接下来是一个完整的示例,展示如何使用formatted_text_hooks来格式化文本:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Formatted Text Hooks Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Formatted Text Hooks Demo'),
        ),
        body: Center(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: FormattedTextWidget(),
          ),
        ),
      ),
    );
  }
}

class FormattedTextWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FormattedText(
      text: 'This is a formatted text example. This part is bold and this part is italic.',
      textStyle: TextStyle(fontSize: 18),
      parts: [
        TextPart(
          start: 25,
          end: 39, // "This part is" 的长度
          textStyle: TextStyle(fontWeight: FontWeight.bold),
        ),
        TextPart(
          start: 41,
          end: 54, // "bold and this" 之后到 "italic." 之前的长度 (不包括空格)
          textStyle: TextStyle(fontStyle: FontStyle.italic),
        ),
      ],
    );
  }
}

// 自定义的FormattedText组件,因为formatted_text_hooks库本身可能不提供直接的FormattedText组件,
// 这里展示了一个自定义实现的方式。实际使用中,你可能需要根据formatted_text_hooks库的具体API来调整。
class FormattedText extends StatelessWidget {
  final String text;
  final TextStyle textStyle;
  final List<TextPart> parts;

  FormattedText({required this.text, required this.textStyle, required this.parts});

  @override
  Widget build(BuildContext context) {
    List<TextSpan> spans = [];
    int lastIndex = 0;

    for (var part in parts) {
      spans.add(TextSpan(
        text: text.substring(lastIndex, part.start),
        style: textStyle,
      ));
      spans.add(TextSpan(
        text: text.substring(part.start, part.end),
        style: textStyle.merge(part.textStyle),
      ));
      lastIndex = part.end;
    }

    // 添加剩余未格式化的文本部分(如果有)
    if (lastIndex < text.length) {
      spans.add(TextSpan(
        text: text.substring(lastIndex),
        style: textStyle,
      ));
    }

    return RichText(
      text: TextSpan(
        style: textStyle,
        children: spans,
      ),
    );
  }
}

class TextPart {
  final int start;
  final int end;
  final TextStyle textStyle;

  TextPart({required this.start, required this.end, required this.textStyle});
}

在这个示例中,我们定义了一个FormattedText组件,它接受一个文本字符串、一个基础文本样式以及一个TextPart列表。每个TextPart表示文本中的一个部分,以及该部分应该应用的样式。然后,我们使用RichText组件来渲染这些格式化后的文本部分。

请注意,formatted_text_hooks库的具体API可能会有所不同,上述代码展示的是一个概念性的实现。在实际使用中,你可能需要参考该库的文档和示例代码来适应其API。如果formatted_text_hooks库提供了直接的格式化组件或函数,那么你可以直接使用它们,而无需自定义FormattedText组件。

回到顶部