Alex Talebi
e6ecca06dd
Fix text selection toolbar alignment for RTL languages (#169854)
<!--
Thanks for filing a pull request!
Reviewers are typically assigned within a week of filing a request.
To learn more about code review, see our documentation on Tree Hygiene:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
-->
**Fix text selection toolbar alignment for RTL (right-to-left)
languages**
This PR updates the Material text selection toolbar to properly support
right-to-left (RTL) layouts. Previously, the toolbar and its buttons did
not align or order correctly when using RTL text direction, leading to a
broken or confusing user experience for RTL languages.
**Summary of changes:**
- Refactored layout logic in `text_selection_toolbar.dart` to handle RTL
and LTR directions for both horizontal and overflow (vertical)
arrangements.
- Updated padding logic in `text_selection_toolbar_text_button.dart` to
use `EdgeInsetsDirectional`, ensuring correct padding for both text
directions.
- Added new widget tests to verify that:
- Toolbar items are ordered right-to-left in RTL contexts.
- The overflow menu behaves correctly in RTL, showing items in the
correct order and position.
**Before:**
- Toolbar items and overflow menus did not respect RTL layout, resulting
in misaligned or reversed button order.
- Padding was inconsistent in RTL.
<details>
<summary>Before Screenshots</summary>
| LTR Not Expanded | LTR Expanded | RTL Not Expanded | RTL Expanded |
|---|---|---|---|
| 
| 
|

|

|
</details>
**After:**
- Toolbar items and overflow menus are correctly ordered and aligned for
RTL.
- Button padding is now directionally correct.
<details>
<summary>After Screenshots</summary>
| LTR Not Expanded | LTR Expanded | RTL Not Expanded | RTL Expanded |
|---|---|---|---|
|

|

|

|

|
</details>
This improves the usability and accessibility of text selection controls
for users of RTL languages.
Fixes #59306
---
## Pre-launch Checklist
- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
If you need help, consider asking for advice on the #hackers-new channel
on [Discord].
<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
2025-06-25 21:00:49 +00:00
..
2025-03-14 17:50:20 +00:00
2025-01-22 21:52:11 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-03-14 17:50:20 +00:00
2025-06-20 23:07:37 +00:00
2025-06-20 23:07:37 +00:00
2025-05-07 16:52:38 +00:00
2024-12-19 20:06:21 +00:00
2025-06-02 13:58:26 +00:00
2024-12-19 20:06:21 +00:00
2025-05-05 01:28:40 +00:00
2025-03-14 17:50:20 +00:00
2025-03-14 17:50:20 +00:00
2025-03-14 17:50:20 +00:00
2025-01-24 21:33:27 +00:00
2025-03-14 17:50:20 +00:00
2025-05-14 17:38:18 +00:00
2025-05-14 17:38:18 +00:00
2025-05-30 21:57:30 +00:00
2024-12-19 20:06:21 +00:00
2025-05-30 21:57:30 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-04-30 23:46:11 +00:00
2024-12-19 20:06:21 +00:00
2025-04-02 21:28:56 +00:00
2025-05-30 21:57:30 +00:00
2025-03-14 17:50:20 +00:00
2025-05-23 00:02:01 +00:00
2025-04-16 19:10:38 +00:00
2025-05-14 02:07:34 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2025-05-16 22:39:54 +00:00
2025-03-14 17:50:20 +00:00
2025-03-14 17:50:20 +00:00
2025-01-14 05:13:41 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-04-02 22:00:19 +00:00
2024-12-19 20:06:21 +00:00
2025-06-11 16:00:50 +00:00
2025-06-21 23:02:13 +00:00
2025-06-21 23:02:13 +00:00
2025-02-06 18:40:25 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-06-25 17:26:10 +00:00
2025-05-02 20:52:14 +00:00
2025-03-14 17:50:20 +00:00
2025-06-18 05:29:09 +00:00
2025-03-14 17:50:20 +00:00
2025-05-12 23:37:28 +00:00
2025-03-14 17:50:20 +00:00
2025-06-24 07:08:21 +00:00
2025-06-21 23:02:13 +00:00
2025-06-11 23:08:37 +00:00
2024-12-19 20:06:21 +00:00
2025-06-24 07:08:21 +00:00
2025-04-30 23:46:11 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-04-02 21:28:56 +00:00
2025-01-22 21:52:11 +00:00
2025-04-30 23:46:11 +00:00
2025-02-13 08:33:12 +00:00
2025-01-24 21:33:27 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-01-24 21:33:27 +00:00
2024-12-19 20:06:21 +00:00
2025-03-14 17:50:20 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2025-04-30 23:46:11 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-01-24 21:33:27 +00:00
2025-03-14 17:50:20 +00:00
2025-01-24 21:33:27 +00:00
2024-12-19 20:06:21 +00:00
2025-01-22 21:52:11 +00:00
2025-06-21 23:02:13 +00:00
2025-06-25 19:12:23 +00:00
2025-06-11 18:50:54 +00:00
2025-04-09 04:47:20 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-03-14 17:50:20 +00:00
2025-05-05 23:57:33 +00:00
2024-12-19 20:06:21 +00:00
2025-01-24 21:33:27 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-06-02 08:00:46 +00:00
2025-06-02 08:00:46 +00:00
2025-06-02 08:00:46 +00:00
2025-06-02 08:00:46 +00:00
2025-06-02 08:00:46 +00:00
2025-06-02 08:00:46 +00:00
2025-04-30 23:46:11 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2025-03-14 17:50:20 +00:00
2025-05-06 23:36:52 +00:00
2025-03-17 17:00:05 +00:00
2024-12-19 20:06:21 +00:00
2025-04-03 00:33:58 +00:00
2025-03-14 17:50:20 +00:00
2025-05-19 22:06:58 +00:00
2025-05-26 21:55:10 +00:00
2025-02-20 07:48:23 +00:00
2025-06-25 19:25:50 +00:00
2025-06-25 19:25:50 +00:00
2025-06-25 19:25:50 +00:00
2025-06-11 23:25:14 +00:00
2024-12-19 20:06:21 +00:00
2025-03-14 17:50:20 +00:00
2025-04-02 21:28:56 +00:00
2025-05-22 04:26:06 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-06-21 23:02:13 +00:00
2025-03-14 17:50:20 +00:00
2025-06-21 23:02:13 +00:00
2025-03-14 17:50:20 +00:00
2025-04-15 23:52:25 +00:00
2025-03-14 17:50:20 +00:00
2025-05-22 21:43:54 +00:00
2025-06-11 23:25:14 +00:00
2025-06-11 23:25:14 +00:00
2025-03-14 17:50:20 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-03-14 17:50:20 +00:00
2025-05-06 05:25:32 +00:00
2025-04-30 18:43:49 +00:00
2025-03-14 17:50:20 +00:00
2025-03-14 17:50:20 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-06-17 18:37:11 +00:00
2025-01-15 11:23:41 +00:00
2025-04-30 23:46:11 +00:00
2025-03-14 17:50:20 +00:00
2025-01-14 05:13:41 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2025-03-14 17:50:20 +00:00
2025-06-25 19:12:23 +00:00
2025-04-10 07:11:24 +00:00
2025-05-02 23:32:32 +00:00
2024-12-19 20:06:21 +00:00
2025-03-14 17:50:20 +00:00
2025-06-25 21:00:49 +00:00
2025-03-14 17:50:20 +00:00
2025-02-21 18:40:05 +00:00
2025-06-21 23:02:13 +00:00
2025-03-14 17:50:20 +00:00
2025-05-16 17:29:12 +00:00
2025-05-02 01:57:19 +00:00
2025-06-21 23:02:13 +00:00
2024-12-19 20:06:21 +00:00
2025-04-15 23:52:25 +00:00
2025-04-15 23:52:25 +00:00
2025-05-20 20:23:07 +00:00
2025-03-17 17:00:05 +00:00
2024-12-19 20:06:21 +00:00
2025-06-24 00:10:55 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00
2024-12-19 20:06:21 +00:00