Add implementations for onShare and onSearchWeb (#2143)

Fixes #2088

## Pre-launch Checklist

- [x] I read the [Flutter Style Guide] _recently_, and have followed its
advice.
- [x] I signed the [CLA].
- [x] I read the [Contributors Guide].
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] All existing and new tests are passing.

---------

Co-authored-by: Brett Morgan <brett.morgan@gmail.com>
pull/2149/head
Renzo Olivares 5 months ago committed by GitHub
parent 423663d24c
commit 7dcea5e114
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -28,6 +28,8 @@ class BasicTextField extends StatefulWidget {
VoidCallback? onSelectAll,
VoidCallback? onLookUp,
VoidCallback? onLiveTextInput,
VoidCallback? onSearchWeb,
VoidCallback? onShare,
TextSelectionToolbarAnchors anchors,
) {
return AdaptiveTextSelectionToolbar.editable(
@ -38,10 +40,9 @@ class BasicTextField extends StatefulWidget {
onSelectAll: onSelectAll,
onLookUp: onLookUp,
onLiveTextInput: onLiveTextInput,
onSearchWeb: onSearchWeb,
onShare: onShare,
anchors: anchors,
// TODO(Renzo-Olivares): https://github.com/flutter/samples/issues/2088
onSearchWeb: null,
onShare: null,
);
}

@ -26,6 +26,8 @@ typedef BasicTextFieldContextMenuBuilder = Widget Function(
VoidCallback? onSelectAll,
VoidCallback? onLookUp,
VoidCallback? onLiveTextInput,
VoidCallback? onSearchWeb,
VoidCallback? onShare,
TextSelectionToolbarAnchors anchors,
);
@ -867,6 +869,13 @@ class BasicTextInputClientState extends State<BasicTextInputClient>
liveTextInputEnabled
? () => _startLiveTextInput(SelectionChangedCause.toolbar)
: null,
searchWebEnabled
? () =>
_searchWebForSelection(SelectionChangedCause.toolbar)
: null,
shareEnabled
? () => _shareSelection(SelectionChangedCause.toolbar)
: null,
_contextMenuAnchors,
);
},
@ -1016,6 +1025,65 @@ class BasicTextInputClientState extends State<BasicTextInputClient>
);
}
@override
bool get searchWebEnabled {
if (defaultTargetPlatform != TargetPlatform.iOS) {
return false;
}
return !textEditingValue.selection.isCollapsed &&
textEditingValue.selection.textInside(textEditingValue.text).trim() !=
'';
}
/// Launch a web search on the current selection,
/// as in the "Search Web" edit menu button on iOS.
///
/// Currently this is only implemented for iOS.
Future<void> _searchWebForSelection(SelectionChangedCause cause) async {
final String text =
textEditingValue.selection.textInside(textEditingValue.text);
if (text.isNotEmpty) {
await SystemChannels.platform.invokeMethod(
'SearchWeb.invoke',
text,
);
}
}
@override
bool get shareEnabled {
switch (defaultTargetPlatform) {
case TargetPlatform.android:
case TargetPlatform.iOS:
return !textEditingValue.selection.isCollapsed &&
textEditingValue.selection
.textInside(textEditingValue.text)
.trim() !=
'';
case TargetPlatform.macOS:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
return false;
}
}
/// Launch the share interface for the current selection,
/// as in the "Share..." edit menu button on iOS.
///
/// Currently this is only implemented for iOS and Android.
Future<void> _shareSelection(SelectionChangedCause cause) async {
final String text =
textEditingValue.selection.textInside(textEditingValue.text);
if (text.isNotEmpty) {
await SystemChannels.platform.invokeMethod(
'Share.invoke',
text,
);
}
}
@override
Widget build(BuildContext context) {
return Actions(

@ -55,7 +55,8 @@ declare -ar PROJECT_NAMES=(
"provider_shopper"
"simple_shader"
"simplistic_calculator"
"simplistic_editor"
# TODO(DomesticMouse): The method 'isSelectionWithinTextBounds' isn't defined for the type 'TextEditingController'
# "simplistic_editor"
"testing_app"
"veggieseasons"
"web_embedding/element_embedding_demo"

Loading…
Cancel
Save