| // 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 [FocusableActionDetector]. |
| |
| void main() => runApp(const FocusableActionDetectorExampleApp()); |
| |
| class FocusableActionDetectorExampleApp extends StatelessWidget { |
| const FocusableActionDetectorExampleApp({super.key}); |
| |
| @override |
| Widget build(BuildContext context) { |
| return const MaterialApp( |
| home: FocusableActionDetectorExample(), |
| ); |
| } |
| } |
| |
| class FadButton extends StatefulWidget { |
| const FadButton({ |
| super.key, |
| required this.onPressed, |
| required this.child, |
| }); |
| |
| final VoidCallback onPressed; |
| final Widget child; |
| |
| @override |
| State<FadButton> createState() => _FadButtonState(); |
| } |
| |
| class _FadButtonState extends State<FadButton> { |
| bool _focused = false; |
| bool _hovering = false; |
| bool _on = false; |
| late final Map<Type, Action<Intent>> _actionMap; |
| final Map<ShortcutActivator, Intent> _shortcutMap = const <ShortcutActivator, Intent>{ |
| SingleActivator(LogicalKeyboardKey.keyX): ActivateIntent(), |
| }; |
| |
| @override |
| void initState() { |
| super.initState(); |
| _actionMap = <Type, Action<Intent>>{ |
| ActivateIntent: CallbackAction<Intent>( |
| onInvoke: (Intent intent) => _toggleState(), |
| ), |
| }; |
| } |
| |
| Color get color { |
| Color baseColor = Colors.lightBlue; |
| if (_focused) { |
| baseColor = Color.alphaBlend(Colors.black.withOpacity(0.25), baseColor); |
| } |
| if (_hovering) { |
| baseColor = Color.alphaBlend(Colors.black.withOpacity(0.1), baseColor); |
| } |
| return baseColor; |
| } |
| |
| void _toggleState() { |
| setState(() { |
| _on = !_on; |
| }); |
| } |
| |
| void _handleFocusHighlight(bool value) { |
| setState(() { |
| _focused = value; |
| }); |
| } |
| |
| void _handleHoveHighlight(bool value) { |
| setState(() { |
| _hovering = value; |
| }); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return GestureDetector( |
| onTap: _toggleState, |
| child: FocusableActionDetector( |
| actions: _actionMap, |
| shortcuts: _shortcutMap, |
| onShowFocusHighlight: _handleFocusHighlight, |
| onShowHoverHighlight: _handleHoveHighlight, |
| child: Row( |
| children: <Widget>[ |
| Container( |
| padding: const EdgeInsets.all(10.0), |
| color: color, |
| child: widget.child, |
| ), |
| Container( |
| width: 30, |
| height: 30, |
| margin: const EdgeInsets.all(10.0), |
| color: _on ? Colors.red : Colors.transparent, |
| ), |
| ], |
| ), |
| ), |
| ); |
| } |
| } |
| |
| class FocusableActionDetectorExample extends StatefulWidget { |
| const FocusableActionDetectorExample({super.key}); |
| |
| @override |
| State<FocusableActionDetectorExample> createState() => _FocusableActionDetectorExampleState(); |
| } |
| |
| class _FocusableActionDetectorExampleState extends State<FocusableActionDetectorExample> { |
| @override |
| Widget build(BuildContext context) { |
| return Scaffold( |
| appBar: AppBar( |
| title: const Text('FocusableActionDetector Example'), |
| ), |
| body: Center( |
| child: Row( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| Padding( |
| padding: const EdgeInsets.all(8.0), |
| child: TextButton(onPressed: () {}, child: const Text('Press Me')), |
| ), |
| Padding( |
| padding: const EdgeInsets.all(8.0), |
| child: FadButton(onPressed: () {}, child: const Text('And Me')), |
| ), |
| ], |
| ), |
| ), |
| ); |
| } |
| } |