Tappy Keyboard
A powerful and customizable embedded keyboard solution for Flutter applications, offering flexible layouts, theming, and hotkey support.
Table of Contents
Features
- 🎹 Customizable layouts
- 🔤 Multiple input types (numeric, alphanumeric)
- 🎨 Theming options with customizable colors and styles
- 📱 Responsive design for all screen sizes
- 🔄 Easy integration with existing Flutter apps
- 🎯 Animations & transitions
- đź”’ Secure input handling


Installation
Add the package to your pubspec.yaml:
flutter pub add tappy_keyboard
Usage
Here's a simple example of how to use the embedded keyboard:
import 'package:tappy_keyboard/tappy_keyboard.dart';
final controller = TappyKeyboardController();
TappyKeyboard(
controller: controller,
type: TappyKeyboardType.numeric,
showOnFocus: false,
);
Register hotkeys by providing modifier keys and a callback:
Note:
Hotkeys only work when the on-screen keyboard has focus. If it loses focus (e.g., due to a touch or mouse interaction elsewhere), hotkey input will not be detected—even if the correct keys are pressed. You’ll need to refocus the keyboard and retype the hotkey, regardless of key order. This happens because the system only processes key events when the input widget is actively focused.
controller.addHotKey(
TappyKeyboardHotKey(
modifiers: [
TappyKeyboardKeyData(keyAction: TappyKeyAction.ctl),
TappyKeyboardKeyData(keyAction: TappyKeyAction.alt),
TappyKeyboardKeyData(keyAction: TappyKeyAction.letter, text: 'q'),
],
callback: () {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("Hi Ctrl + Shift + A!"),
),
);
},
),
);
TappyKeyboard(
controller: controller,
type: TappyKeyboardType.alphanumeric,
showAtSymbol: false,
tabSpaceSize: 4,
onTap: (key) {},
child: Padding(
padding: const EdgeInsets.all(40.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
for (int i = 1; i <= 15; i++)
TextField(
decoration: InputDecoration(
label: Text("Input Field $i"),
),
),
],
),
),
);
Dispose the controller to free resources and prevent memory leaks
controller.dispose();
For more advanced usage and customization options, check out the example app in the /example directory.
Customization
The keyboard can be customized in various ways:
TappyKeyboard(
controller: TappyKeyboardController(),
theme: TappyKeyboardTheme(
backgroundColor: Colors.transparent,
),
type: TappyKeyboardType.numeric,
onTap: (key){},
)
Example
Explore a full demo in the example folder.
Contributing
We welcome contributions! Please open an issue or submit a Pull Request for any improvements or bug fixes.
License
This project is licensed under the MIT License. See the LICENSE file for details.
Libraries
- exceptions/exception
- exceptions/hot_key
- tappy_keyboard
- tappy_keyboard/alphanumeric_keyboard
- tappy_keyboard/controllers/hot_keys_controller
- tappy_keyboard/controllers/input_focus
- tappy_keyboard/controllers/keyboard
- tappy_keyboard/data/keys
- tappy_keyboard/keyboard
- tappy_keyboard/keyboard_key
- tappy_keyboard/numeric_keyboard
- tappy_keyboard/theme
- tappy_keyboard/type/hot_key
- tappy_keyboard/type/key
- tappy_keyboard/type/key_action
- tappy_keyboard/type/key_data
- tappy_keyboard/type/keyboard_pane
- tappy_keyboard/type/keyboard_type
- tappy_keyboard/utils/hot_key
- tappy_keyboard/utils/key
- widgets/submit_form