You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Implements the framework side of secure paste milestone 2, where the iOS
system context menu items can be customized.
Depends on PR flutter/flutter#161103. Currently
I've merged that PR into this one for testing, but I think that PR
should merge separately first.
### Widget API (most users)
```dart
TextField(
contextMenuBuilder: (BuildContext context, EditableTextState editableTextState) {
return SystemContextMenu.editableText(
editableTextState: editableTextState,
// items is optional
items: <IOSSystemContextMenuItem>[
const IOSSystemContextMenuItemCut(),
constIOS SystemContextMenuItemCopy(),
const IOSSystemContextMenuItemPaste(),
const IOSSystemContextMenuItemSelectAll(),
const IOSSystemContextMenuItemSearchWeb(
title: 'Search!', // title is optional for this button, defaults to localized string
),
// Milestone 3:
IOSSystemContextMenuItemCustom(
// title and onPressed are required
title: 'custom button',
onPressed: () {
print('pressed the custom button.');
}
),
],
);
},
),
```
### Raw Controller API
```dart
_systemContextMenuController.show(
widget.anchor,
<IOSSystemContextMenuItemData>[
// Notice these are different classes than those used for the widget. That's
// mainly because I can't provide localized defaults here, so the titles are
// required in the classes that have titles.
const IOSSystemContextMenuItemDataCut(),
const IOSSystemContextMenuItemDataCopy(),
const IOSSystemContextMenuItemDataPaste(),
const IOSSystemContextMenuItemDataSelectAll(),
const IOSSystemContextMenuItemDataSearchWeb(
title: 'Search!', // title is required.
),
// Milestone 3:
IOSSystemContextMenuItemDataCustom(
// title and onPressed are required as before.
title: 'custom button',
onPressed: () {
print('pressed the custom button.');
}
),
],
);
```
<details>
<summary>Json format</summary>
```dart
return _channel.invokeMethod<Map<String, dynamic>>(
'ContextMenu.showSystemContextMenu',
<String, dynamic>{
'targetRect': <String, double>{
'x': targetRect.left,
'y': targetRect.top,
'width': targetRect.width,
'height': targetRect.height,
},
'items': <dynamic>[
<String, dynamic>{
'type': 'default',
'action': 'paste',
},
<String, dynamic>{
'type': 'default',
'action': 'copy',
},
<String, dynamic>{
'type': 'default',
'title': 'Crazy Title',
'action': 'share',
},
],
},
);
```
</summary>
</details>
### Localization changes
This change requires the SystemContextMenu widget in the widgets library
to be able to look up the default localized label for several context
menu buttons like "Copy", etc. Those strings previously resided in
MaterialLocalizations and CupertinoLocalizations, but not in
WidgetsLocalizations, so I have copied the necessary strings into
WidgetsLocalizations.
---------
Co-authored-by: Huan Lin <hellohuanlin@gmail.com>
0 commit comments