Repository: flutter
Issue: [macOS] Selectable rich text with gesture recognizer should be focusable.
Labels: framework,f: material design,a: accessibility,platform-mac,f: gestures,team-design,triaged-design

In renderEditable, we break Selectable rich text into multiple semantics nodes if the platform is NOT macOS.

Flutter does not support text selection across multiple semantic node, but that is ok for mobile platforms because their assistive technology does not allow selection in selectable text, and they also does not use the text selection information from the semantics node.

This is not the case for macOS. The macOS will read the selection text range and announce it back to the user, and that works well if the selection is only in one semantics node. It does not provide a public API to implement selection across multiple semantics node. Therefore, we should force selectable text to send one semantics node to macOS until they have API to do selection across multiple semantics node.  


<details>
<summary> repro </summary>

```dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/gestures.dart';
import 'package:url_launcher/url_launcher.dart';
void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
          body: Scaffold(
              body: Center(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      SelectableText.rich(
                        TextSpan(
                          children: <TextSpan>[
                            TextSpan(text: 'This', style: TextStyle(color: Colors.blue)),
                            TextSpan(text: 'is', style: TextStyle(color: Colors.black)),
                            TextSpan(
                                text: 'test',
                                style: TextStyle(
                                    color: Colors.blue, decoration: TextDecoration.underline),
                                recognizer: TapGestureRecognizer()
                                  ..onTap = () async {
                                    var url = "https://flutter.dev/";
                                    if (await canLaunch(url)) {
                                      await launch(url);
                                    } else {
                                      throw 'Could not launch $url';
                                    }
                                  }),
                          ],
                        ),
                        style: TextStyle(
                            color: Colors.blue, fontWeight: FontWeight.bold, fontSize: 48),
                        textAlign: TextAlign.center,
                      ),
                      Text.rich(
                        TextSpan(
                          children: <TextSpan>[
                            TextSpan(text: 'This', style: TextStyle(color: Colors.blue)),
                            TextSpan(text: 'is', style: TextStyle(color: Colors.black)),
                            TextSpan(
                                text: 'test',
                                style: TextStyle(
                                    color: Colors.blue, decoration: TextDecoration.underline),
                                recognizer: TapGestureRecognizer()
                                  ..onTap = () async {
                                    var url = "https://flutter.dev/";
                                    if (await canLaunch(url)) {
                                      await launch(url);
                                    } else {
                                      throw 'Could not launch $url';
                                    }
                                  }),
                          ],
                        ),
                        style: TextStyle(
                            color: Colors.blue, fontWeight: FontWeight.bold, fontSize: 48),
                        textAlign: TextAlign.center,
                      ),
                      TextField(controller: TextEditingController(text: 'thisistext'),)
                    ],
                  )))),
    ),
  );
}
```

</details>