Обнаружение жестов в Flutter TextSpan

Есть ли способ определить, какое слово в TextSpan было затронуто пользователем?

Этот абзац здесь, чтобы обойти робота переполнения стека, который настаивает, чтобы я писал больше :)


person adko    schedule 21.02.2018    source источник
comment
Надо было прочитать документ немного внимательнее. Для этой цели есть свойство «распознаватель», но похоже, что мне придется создавать отдельный TextSpan для каждого слова.   -  person adko    schedule 21.02.2018
comment
Просто разделите свою строку с помощью " " и повторите, чтобы создать массив текстовых панелей   -  person Tree    schedule 22.02.2018


Ответы (4)


Вы можете улучшить сами

import 'package:flutter/gestures.dart';
...

new RichText(
      text: new TextSpan(text: 'Non touchable. ', children: [
        new TextSpan(
          text: 'Tap here.',
          recognizer: new TapGestureRecognizer()..onTap = () => print('Tap Here onTap'),
        )
      ]),
    );
person Putra Ardiansyah    schedule 24.04.2018
comment
Спасибо, я забыл импортировать пакет "gestures.dart"; После использования import 'package: flutter / gestures.dart'; это сработало для меня .. - person MUHAMMED IQBAL PA; 12.02.2019
comment
Помните, что инициируемые события действуют только для text, а не для TextSpan, предоставленного в children. - person surenyonjan; 17.04.2019
comment
Почему вы используете .. вместо. ? - person Sachintha Udara; 30.05.2019
comment
Как бы вы это протестировали? Если это RichText с несколькими TextSpan, и один из них является TextSpan, который можно нажимать, как бы вы коснулись его во время теста? - person lawonga; 11.07.2019
comment
Как насчет вызова dispose() метода TapGestureRecognizer? Это необходимо? - person Alex Semeniuk; 06.08.2019

Снимок экрана:

введите описание изображения здесь


Используйте свойство recognizer TextSpan, которое допускает почти все типы событий.

RichText(
  text: TextSpan(
    children: [
      TextSpan(
        text: 'Single tap',
        style: TextStyle(color: Colors.red[300]),
        recognizer: TapGestureRecognizer()..onTap = () {
          // Single tapped.
        },
      ),
      TextSpan(
        text: ' Double tap',
        style: TextStyle(color: Colors.green[300]),
        recognizer:  DoubleTapGestureRecognizer()..onDoubleTap = () {
          // Double tapped.
        }
      ),
      TextSpan(
        text: ' Long press',
        style: TextStyle(color: Colors.blue[300]),
        recognizer: LongPressGestureRecognizer()..onLongPress = () {
          // Long Pressed.
        },
      ),
    ],
  ),
)

person CopsOnRoad    schedule 10.04.2019
comment
Как передать подчеркнутый текст методу, обрабатывающему касания? - person Alex Semeniuk; 06.08.2019

Перебрать строку, чтобы получить массив строк, создать отдельный текстовый диапазон для каждой и добавить распознаватель жестов.

 List<TextSpan> createTextSpans(){
    final string = """Text seems like it should be so simple, but it really isn't.""";
    final arrayStrings = string.split(" ");
    List<TextSpan> arrayOfTextSpan = [];
    for (int index = 0; index < arrayStrings.length; index++){
      final text = arrayStrings[index] + " ";
      final span = TextSpan(
        text: text,
        recognizer: TapGestureRecognizer()..onTap = () => print("The word touched is $text")
      );
      arrayOfTextSpan.add(span);
    }
    return arrayOfTextSpan;
person abubz    schedule 08.01.2020
comment
почему эта двойная точка? - person Alan Donizete; 21.01.2020
comment
вы можете прочитать об этом здесь - person abubz; 28.01.2020

Сделать GestureRecognizer - это их попытка сделать что-нибудь доступным для прикосновения. распознаватель жестов, который будет получать события, которые попадают в этот Span.

составьте простой виджет, содержащий TextSpan с recognizer.

Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          RichText(
            textAlign: TextAlign.center,
            text: TextSpan(children: <InlineSpan>[
              TextSpan(
                  text: 'By signing up, you agree to our ',
                  style: TextStyle(color: Colors.black87)),
              TextSpan(
                  recognizer: TapGestureRecognizer()..onTap = () {
                    print('Terms and Conditions Single Tap');
                  },
                  text: 'Terms and Conditions',
                  style: TextStyle(
                      color: Colors.blueAccent,
                      fontWeight: FontWeight.bold)),
            ]),
          ),
          RichText(
            textAlign: TextAlign.center,
            text: TextSpan(children: <InlineSpan>[
              TextSpan(
                  text: 'Already have an account ',
                  style: TextStyle(color: Colors.black87)),
              TextSpan(
                  recognizer: DoubleTapGestureRecognizer()..onDoubleTap = () {
                    print('Contact Us Double Tap');
                  },
                  text: 'Contact Us',
                  style: TextStyle(
                      color: Colors.blueAccent,
                      fontWeight: FontWeight.bold)),
            ]),
          )
        ],
      ))

введите описание изображения здесь

person Paresh Mangukiya    schedule 07.10.2020