tree 4dd5596ad07ca3c5f5941e5fc12f29e0891a6d58
parent f45741bc5195921751a25854fb501af5c86f29eb
author Justin McCandless <jmccandless@google.com> 1712613665 -0700
committer GitHub <noreply@github.com> 1712613665 +0000
gpgsig -----BEGIN PGP SIGNATURE-----
 
 wsFcBAABCAAQBQJmFGkhCRC1aQ7uu5UhlAAAnicQAKj/MZKUTKWC7MgYeTKCmdBk
 HsaNTNq86qL2dJJ/4M4pvaDHESPPz3wzyM+JzRgMRnL7CqTxF+3C40c4++upIXya
 kOxX98rmOW0jkJDmKbp9/ffWAItMbaKmFXnt0Pyn9P2w6IarUdE47dtG16yvYqM1
 EwDY7kdmqSLSQW2doS3BVqJnD+4xZY7xu8wPtvI1A8MnylyiGIFdvlcRj7YVcg9i
 0JmyueZWWMd+ed0ocAoZrOkjXuVpMdm2W2R/CkiFrX1LUsJhaRMUfSJZZgnZKV4l
 qtMoHRDM711vbFJKxc3EWj3Zx5NYmL0DgYrXz7hhREovnjebMKO243mTq02v2Y+A
 KOtWoE8HTHOB4Dy9lNDhDmyHo+scHv4qVuuLAOh1U46sXpVjQNCYKCnVaN1mFeph
 a5yFSKob2PtT2ADNuxB3ivvSiS9xLc/8yfjSkuhyFRgnmA4DjeYfLY6QydPa4ZnA
 ilujVSkVHxFY6FQ0TCnO6RKwiaaPkfk82aT/1ESeDpYnWQwvQjDxSbrfr1jMz4ht
 LF2onYlJgUXK77posIi/XDV9iIbLtcqn5oe6TEU2VCYt7zAKNyoacFmzuvirPPGD
 qnxh2HZYbwS5gbil6LZyWA1xx1bdHatEbCrO7jr4ohcKt7BARk2ccanhzYVoypY6
 FydFBUM6xFBUR/pAGk0E
 =0K/T
 -----END PGP SIGNATURE-----
 

Text editing inside of Transformed.scale (#146019)

Fixes bugs in the text selection positioning calculations so that they work even when the field is scaled. In many cases, we were simply translating things around without applying the proper localToGlobal (or vice versa) transform.

| Before | After |
| --- | --- |
| <img src="https://github.com/flutter/flutter/assets/389558/a5a45472-98c5-4cdf-b382-218971fd9404" /> | <img src="https://github.com/flutter/flutter/assets/389558/f396a1af-2546-4e38-a9d9-6c6edfa38d94" /> |

Partial fix for: https://github.com/flutter/flutter/issues/144685
It looks like there are other problems where transforms aren't applied properly. Putting a transform at the root of the application, above MaterialApp, will expose more problems.

<details>

<summary>Sample code</summary>

```dart
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() => runApp(const _App());

class _App extends StatelessWidget {
  const _App();

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(home: _Home());
  }
}

class _Home extends StatefulWidget {
  const _Home();

  @override
  State<_Home> createState() => _HomeState();
}

class _HomeState extends State<_Home> {
  final _controller = WebViewController();
  final TextEditingController textEditingController = TextEditingController(
    text: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
  );
  final OverlayPortalController overlayPortalController = OverlayPortalController();

  @override
  void initState() {
    super.initState();
    _controller
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..loadRequest(Uri.https('api.flutter.dev'));
  }

  @override
  Widget build(BuildContext context) {
    overlayPortalController.show();
    return Scaffold(
      appBar: AppBar(
        title: const Text('Scaled WebView Tester'),
      ),
      body: Stack(
        children: <Widget>[
          Transform.scale(
            alignment: Alignment.topLeft,
            scale: 0.5,
            child: TextField(
              controller: textEditingController,
              maxLines: null,
            ),
          ),
          OverlayPortal(
            controller: overlayPortalController,
            overlayChildBuilder: (BuildContext context) {
              return Positioned(
                top: 0.0,
                left: 0.0,
                child: SizedBox(
                  height: 1000,
                  width: 1000,
                  child: Stack(
                    children: <Widget>[
                      Positioned(
                        top: 90.0,
                        left: 0.0,
                        child: Container(
                          height: 1.0,
                          width: 1000,
                          color: Colors.blue,
                        ),
                      ),
                      Positioned(
                        top: 102.0,
                        left: 0.0,
                        child: Container(
                          height: 1.0,
                          width: 1000,
                          color: Colors.blue,
                        ),
                      ),
                    ],
                  ),
                ),
              );
            },
          ),
        ],
      ),
    );
  }
}
```

</details>