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.2There 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 (e.g., "alphanumeric", "symbols") and switch between them using the controller:
keyboardController.switchMode();The keyboard will cycle through modes in the order they are defined in your layout.
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: ..,
),
);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!




