Flutter文本点击事件处理插件click_text_field的使用

Flutter文本点击事件处理插件click_text_field的使用

简介

example 一个支持高亮文本点击事件的Flutter TextField组件。
  • 支持设置正则表达式 (regExp)
  • 支持自定义高亮文本样式 (clickTextStyle)
  • 支持点击回调函数 (onTapText)
  • 提供 suggestClickTextField 组件(Beta版本)

安装

pubspec.yaml 文件中添加依赖:

dev_dependencies:
  click_text_field: ^last_version

然后运行以下命令以安装依赖:

flutter pub get

使用方法

使用 ClickTextField

ClickTextField(
  controller: ClickTextEditingController(), // 控制器
  regExp: RegExp(r'people c'), // 高亮匹配的正则表达式
  clickTextStyle: TextStyle( 
    background: Paint()
      ..style = PaintingStyle.stroke // 设置背景样式
      ..strokeWidth = 2
      ..color = Colors.cyanAccent, // 设置颜色
  ),
  onTapText: (clickCallBack) => { // 点击回调
    debugPrint('U click the highlight text $clickCallBack'),
  }
)

使用 SuggestClickTextField (Beta版本)

SuggestClickTextField(
  controller: ClickTextEditingController(),
  regExp: RegExp(r'people a|people b|people c|embed c|building d|人物一'), // 匹配多个关键词
  textStyle: const TextStyle( 
    color: Colors.deepPurple // 默认文本样式
  ),
  clickTextStyle: TextStyle( 
    background: Paint()
      ..style = PaintingStyle.stroke
      ..strokeWidth = 2
      ..color = Colors.cyanAccent, // 高亮样式
  ),
  onTapText: (clickCallBack) => { 
    debugPrint('U click the highlight text $clickCallBack'),
  }
),

注意事项

在不同SDK版本下运行时可能会报错:

rendering/editable.dart': Failed assertion: line 1336 pos 14: 'readOnly && !obscureText': is not true.

解决方法:

  1. 删除检查代码:
    if (_semanticsInfo!.any((InlineSpanSemanticsInformation info) => info.recognizer != null) &&
    defaultTargetPlatform != TargetPlatform.macOS) {
    // 删除以下代码
    // assert(readOnly && !obscureText);
    }
    
  2. 或者升级到更高版本的SDK。

示例代码

以下是完整的示例代码,展示如何使用 ClickTextFieldSuggestClickTextField

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'click_text_field',
      theme: ThemeData(
        brightness: Brightness.dark
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {

  /// ClickTextEditingController
  final ClickTextEditingController textEditingController = ClickTextEditingController();

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('click_text_field'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            // 使用 ClickTextField
            ClickTextField(
              controller: textEditingController,
              regExp: RegExp(r'people a|people b|people c'),
              clickTextStyle: TextStyle(
                background: Paint()
                  ..style = PaintingStyle.stroke
                  ..strokeWidth = 2
                  ..color = Colors.cyanAccent,
              ),
              onTapText: (clickCallBack) => {
                debugPrint('U click the highlight text $clickCallBack'),
              },
            ),
            // 使用 SuggestClickTextField (Beta)
            // SuggestClickTextField(
            //   controller: ClickTextEditingController(),
            //   regExp: RegExp(r'people a|people b|people c|embed c|building d|人物一'),
            //   textStyle: const TextStyle(
            //     color: Colors.deepPurple
            //   ),
            //   clickTextStyle: TextStyle(
            //     background: Paint()
            //       ..style = PaintingStyle.stroke
            //       ..strokeWidth = 2
            //       ..color = Colors.cyanAccent,
            //   ),
            //   onTapText: (clickCallBack) => {
            //     debugPrint('U click the highlight text $clickCallBack'),
            //   },
            // ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter中,click_text_field 是一个用于处理文本点击事件的插件。它允许你在文本中的特定部分添加点击事件,类似于在HTML中使用<a>标签的效果。这个插件非常适合在需要处理富文本点击事件的场景中使用。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  click_text_field: ^1.0.0  # 请使用最新版本

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

使用 ClickTextField

ClickTextFieldclick_text_field 插件中的核心组件。你可以通过它来定义可点击的文本区域。

基本用法

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ClickTextField Example'),
        ),
        body: Center(
          child: ClickTextField(
            text: 'This is a clickable text. Click here!',
            onTextClick: (text, start, end) {
              print('Clicked text: $text from $start to $end');
            },
          ),
        ),
      ),
    );
  }
}

在这个例子中,ClickTextField 显示了一段文本,并且当用户点击文本时,onTextClick 回调会被触发,返回点击的文本以及点击的起始和结束位置。

自定义点击区域

你可以通过 clickableTexts 参数来定义特定的可点击文本区域:

ClickTextField(
  text: 'This is a clickable text. Click here!',
  clickableTexts: [
    ClickableText(
      text: 'clickable',
      onTap: () {
        print('You clicked on "clickable"');
      },
    ),
    ClickableText(
      text: 'here!',
      onTap: () {
        print('You clicked on "here!"');
      },
    ),
  ],
)

在这个例子中,clickablehere! 这两个词被定义为可点击的文本区域,当用户点击这些词时,相应的 onTap 回调会被触发。

自定义样式

你还可以通过 style 参数来定义文本的样式,以及通过 clickableTextStyle 参数来定义可点击文本的样式:

ClickTextField(
  text: 'This is a clickable text. Click here!',
  style: TextStyle(fontSize: 16, color: Colors.black),
  clickableTexts: [
    ClickableText(
      text: 'clickable',
      onTap: () {
        print('You clicked on "clickable"');
      },
      style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
    ),
    ClickableText(
      text: 'here!',
      onTap: () {
        print('You clicked on "here!"');
      },
      style: TextStyle(color: Colors.red, decoration: TextDecoration.underline),
    ),
  ],
)
回到顶部