// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; /// Flutter code sample for [Action.Action.overridable]. void main() { runApp( const MaterialApp( home: Scaffold( body: Center(child: VerificationCodeGenerator()), ), ), ); } const CopyTextIntent copyTextIntent = CopyTextIntent._(); class CopyTextIntent extends Intent { const CopyTextIntent._(); } class CopyableText extends StatelessWidget { const CopyableText({super.key, required this.text}); final String text; void _copy(CopyTextIntent intent) => Clipboard.setData(ClipboardData(text: text)); @override Widget build(BuildContext context) { final Action<CopyTextIntent> defaultCopyAction = CallbackAction<CopyTextIntent>(onInvoke: _copy); return Shortcuts( shortcuts: const <ShortcutActivator, Intent>{ SingleActivator(LogicalKeyboardKey.keyC, control: true): copyTextIntent }, child: Actions( actions: <Type, Action<Intent>>{ // The Action is made overridable so the VerificationCodeGenerator // widget can override how copying is handled. CopyTextIntent: Action<CopyTextIntent>.overridable(defaultAction: defaultCopyAction, context: context), }, child: Focus( autofocus: true, child: DefaultTextStyle.merge( style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), child: Text(text), ), ), ), ); } } class VerificationCodeGenerator extends StatelessWidget { const VerificationCodeGenerator({super.key}); void _copy(CopyTextIntent intent) { debugPrint('Content copied'); Clipboard.setData(const ClipboardData(text: '111222333')); } @override Widget build(BuildContext context) { return Actions( actions: <Type, Action<Intent>>{CopyTextIntent: CallbackAction<CopyTextIntent>(onInvoke: _copy)}, child: const Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Press Ctrl-C to Copy'), SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ CopyableText(text: '111'), SizedBox(width: 5), CopyableText(text: '222'), SizedBox(width: 5), CopyableText(text: '333'), ], ), ], ), ); } }