找到了覆盖粘贴事件的方法。我不确定,这是一种正确的方法,但它确实有效。
在每个 TextField 中都有 selectionControls,它提供了一种显示和处理工具栏控件的方法。
所以,先捕捉粘贴事件:
class AppCupertinoTextSelectionControls extends CupertinoTextSelectionControls {
AppCupertinoTextSelectionControls({
required this.onPaste,
});
ValueChanged<TextSelectionDelegate> onPaste;
@override
Future<void> handlePaste(final TextSelectionDelegate delegate) {
onPaste(delegate);
return super.handlePaste(delegate);
}
}
class AppMaterialTextSelectionControls extends MaterialTextSelectionControls {
AppMaterialTextSelectionControls({
required this.onPaste,
});
ValueChanged<TextSelectionDelegate> onPaste;
@override
Future<void> handlePaste(final TextSelectionDelegate delegate) {
onPaste(delegate);
return super.handlePaste(delegate);
}
}
- 然后,在您的状态下初始化它(例如在 StatefulWidget 中,它可能看起来像这样,见下文)。要研究它如何在 TextField 中使用,请参阅源代码here
TextSelectionControls? _selectionControls;
@override
void initState() {
if (widget.onPaste != null) {
if (Platform.isIOS) {
_selectionControls = AppCupertinoTextSelectionControls(
onPaste: widget.onPaste!,
);
} else {
_selectionControls = AppMaterialTextSelectionControls(
onPaste: widget.onPaste!,
);
}
}
super.initState();
}
为onPaste 使用类型为ValueChanged<TextSelectionDelegate> 的回调,您可以使用Flutter 团队用来获取剪贴板数据的the same code:
Future<void> onPastePhone(final TextSelectionDelegate? delegate) async {
final TextSelection selection = phoneController.selection;
if (!selection.isValid) {
return;
}
// Snapshot the input before using `await`.
// See https://github.com/flutter/flutter/issues/11427
final ClipboardData? data = await Clipboard.getData(Clipboard.kTextPlain);
final text = data?.text ?? '';
if (text.isEmpty) {
return;
}
}
然后在您的 TextField 中使用选择控件。
TextFormField(
selectionControls: _selectionControls,
)
希望对你有帮助。