A customizable and extensible on-screen virtual keyboard for Flutter applications. Ideal for desktop and touchscreen environments where physical keyboards are unavailable or limited.
|
|
|
|
- π§© Customizable Layouts β Tailor the keyboard layout and style to suit your UI.
- ποΈ Keyboard Modes β Support for multiple keyboard modes like alphanumeric, symbols, etc., with dynamic switching.
- π± Mobile & Desktop Layouts β Comes with built-in layouts for both mobile and desktop platforms.
- π¨ Theming Support β Easily style the keyboard using
OnscreenKeyboardThemeData. - π οΈ Extensible Architecture β Add custom keys or override behavior easily.
- π» Full Desktop Keyboard β Complete support for alphabetic, numeric, symbol, and function keys.
- π€ Integrated Text Field β Comes with dedicated
OnscreenKeyboardTextFieldandOnscreenKeyboardTextFormFieldwidgets to easily handle user input. - π±οΈ Drag & Align β Move and align the keyboard anywhere on screen, including top or bottom alignment.
- π Controller API β Programmatically control keyboard visibility and alignment.
- π₯οΈ Designed for Desktop and Touch Devices β Ideal for touchscreen setups like POS systems.
Add the package to your pubspec.yaml:
dependencies:
flutter_onscreen_keyboard: ^0.4.3+2Or run the command:
flutter pub add flutter_onscreen_keyboard
There are two ways to integrate the keyboard into your root widget:
- Using
OnscreenKeyboard.builder.
return MaterialApp(
builder: OnscreenKeyboard.builder(), // add this line
home: const HomeScreen(),
);- Or using
OnscreenKeyboard.
return MaterialApp(
builder: (context, child) {
// your other codes
// child = ...
// wrap with OnscreenKeyboard
return OnscreenKeyboard(child: child);
},
home: const HomeScreen(),
);You can place the OnscreenKeyboardTextField widget anywhere in your app. It will automatically connect with the keyboard and handle input seamlessly.
@override
Widget build(BuildContext context) {
return const OnscreenKeyboardTextField(
// enableOnscreenKeyboard: false, // default to true
),
}Use OnscreenKeyboard.of(context) to get the keyboard controller instance.
final keyboardController = OnscreenKeyboard.of(context);With the controller, you can open or close the keyboard as needed in your application flow.
keyboardController.open(); // open the keyboard
keyboardController.close(); // close the keyboardYou can define multiple modes in your KeyboardLayout (for example: "alphabet", "symbols", "emojis") and switch between them using the keyboard controller.
keyboardController.switchMode();This cycles through the available modes in the order they are defined in the layout.
keyboardController.setModeNamed('symbols');Use setModeNamed when you want to jump directly to a specific mode.
If the given mode name does not exist in the layout, the call is safely ignored.
By default, the keyboard selects the appropriate layout based on platform:
MobileKeyboardLayoutfor Android/iOS/FuchsiaDesktopKeyboardLayoutfor macOS/Windows/Linux
You can also explicitly set a custom layout:
OnscreenKeyboard.builder(
layout: const MobileKeyboardLayout(), // or your custom layout
// ...more options
),To respond to key presses globally, use the addRawKeyDownListener method.
class _AppState extends State<App> {
late final keyboard = OnscreenKeyboard.of(context);
@override
void initState() {
super.initState();
// listener for raw keyboard events
keyboard.addRawKeyDownListener(_listener);
}
@override
void dispose() {
keyboard.removeRawKeyDownListener(_listener);
super.dispose();
}
void _listener(OnscreenKeyboardKey key) {
switch (key) {
case TextKey(:final primary): // a text key: "a", "b", "4", etc.
log('key: "$primary"');
case ActionKey(:final name): // an action key: "shift", "backspace", etc.
log('action: $name');
}
}
@override
Widget build(BuildContext context) {
// ...
}
}- Styles: Customize key colors, shapes, and padding.
- Layouts: Use built-in or define your own layouts with multiple modes.
- Behaviors: Override key presses and implement custom actions.
Easily apply built-in keyboard styles like Gboard or iOS using predefined factory constructors:
OnscreenKeyboard.builder(
theme: OnscreenKeyboardThemeData.gBoard(),
)OnscreenKeyboardThemeData.gBoard()OnscreenKeyboardThemeData.ios()
An example of theme customization:
final theme = OnscreenKeyboardThemeData(
border: Border.all(color: Colors.white),
margin: const EdgeInsets.all(40),
padding: const EdgeInsets.all(10),
borderRadius: BorderRadius.circular(20),
boxShadow: [
const BoxShadow(
blurRadius: 5,
spreadRadius: 5,
color: Colors.black12,
),
],
// color: ..,
gradient: const LinearGradient(
colors: [Colors.indigo, Colors.indigoAccent],
),
textKeyThemeData: TextKeyThemeData(
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
borderRadius: BorderRadius.circular(20),
margin: const EdgeInsets.all(1),
boxShadow: [
const BoxShadow(blurRadius: 2, color: Colors.black26),
],
// padding: ..,
// textStyle: ..,
// gradient: ...,
// border: ..,
),
actionKeyThemeData: ActionKeyThemeData(
backgroundColor: Colors.blue,
foregroundColor: Colors.white54,
pressedBackgroundColor: Colors.indigo,
pressedForegroundColor: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: [const BoxShadow()],
margin: const EdgeInsets.all(1),
iconSize: 20,
fitChild: false,
// border: ..,
// gradient: ..,
// padding: ..,
),
);Use this approach when you want a simple, inline layout definition without creating a new class.
const layout = KeyboardLayout.custom(
aspectRatio: 1,
modes: {
'alphabet': KeyboardMode(
rows: [
KeyboardRow(
keys: [
OnscreenKeyboardKey.text(primary: 'A'),
OnscreenKeyboardKey.text(primary: 'B'),
],
),
KeyboardRow(
keys: [
OnscreenKeyboardKey.text(primary: 'C'),
OnscreenKeyboardKey.text(primary: 'D'),
],
),
],
),
},
);
const OnscreenKeyboard(
layout: layout,
child: child,
);Use this approach for more complex or reusable layouts, especially when supporting multiple modes.
class MyLayout extends KeyboardLayout {
const MyLayout();
@override
double get aspectRatio => 1;
@override
Map<String, KeyboardMode> get modes => const {
'alphabet': KeyboardMode(
rows: [
KeyboardRow(
keys: [
OnscreenKeyboardKey.text(primary: 'A'),
OnscreenKeyboardKey.text(primary: 'B'),
],
),
KeyboardRow(
keys: [
OnscreenKeyboardKey.text(primary: 'C'),
OnscreenKeyboardKey.text(primary: 'D'),
],
),
],
),
};
}
const OnscreenKeyboard(
layout: MyLayout(),
child: child,
);Browse the source code and contribute here: π https://github.com/albinpk/flutter_onscreen_keyboard
Contributions, issues, and feature requests are welcome! See the CONTRIBUTING.md for guidelines.
This project is licensed under the MIT License.
Created and maintained by Albin PK. If you find this package useful, consider giving it a β on GitHub and a like on pub.dev!




