Флаттер: включить выделение текста с помощью интерактивного TextSpan внутри RichText - PullRequest
2 голосов
/ 25 февраля 2020

У меня есть требование включить выделение текста в RichText. Также мне нужно вызвать некоторый код, когда пользователь нажимает на указанную c TextSpan.

Я устал работать под кодом ниже. Но я замечаю, что onTap работает только с _nonSelectableRichText(), в то время как он не работает с _selectableRichText.

Я не знаю, является ли это ошибкой или нет ... но я спрашиваю, кто-нибудь есть решение, которое сочетает в себе эти две функции?

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

class TestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Builder(
          builder: (context) => Container(
            child: _nonSelectionRichText(context),
            //child: _selectionRichText(context),
          ),
        ),
      ),
    );
  }

  Widget _nonSelectableRichText(BuildContext context) {
    return RichText(
      text: TextSpan(
        children: [
          TextSpan(
              text: "Welcome to ",
              style: TextStyle(color: Colors.black, fontSize: 70)),
          TextSpan(
              text: "Flutter",
              style: TextStyle(color: Colors.black, fontSize: 70),
              recognizer: TapGestureRecognizer()
                ..onTap = () {
                  print("Flutter"); // will work here
                }),
        ],
      ),
    );
  }

  Widget _selectableRichText(BuildContext context) {
    return SelectableText.rich(
      TextSpan(
        children: [
          TextSpan(
              text: "Welcome to ",
              style: TextStyle(color: Colors.black, fontSize: 70)),
          TextSpan(
              text: "Flutter",
              style: TextStyle(color: Colors.black, fontSize: 70),
              recognizer: TapGestureRecognizer()
                ..onTap = () {
                  print("Flutter"); // will not work here
                }),
        ],
      ),
    );
  }
}
...