flutter_onscreen_keyboard 0.1.0
flutter_onscreen_keyboard: ^0.1.0 copied to clipboard
A customizable and extensible virtual keyboard widget for Flutter desktop and touchscreen apps.
flutter_onscreen_keyboard #
A customizable and extensible on-screen virtual keyboard for Flutter applications. Ideal for desktop and touchscreen environments where physical keyboards are unavailable or limited.
โจ Features #
- ๐งฉ 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 a dedicated
OnscreenKeyboardTextField
widget 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.
๐ Getting Started #
๐ฆ Installation #
Add the package to your pubspec.yaml
:
dependencies:
flutter_onscreen_keyboard: ^0.1.0
๐งช Usage #
โ Add OnscreenKeyboard
to Your Root Widget #
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(),
);
๐งพ Use OnscreenKeyboardTextField
Anywhere #
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
),
}
๐๏ธ Access the Keyboard Controller #
Use OnscreenKeyboard.of(context)
to get the keyboard controller instance.
final keyboardController = OnscreenKeyboard.of(context);
๐ Open and Close the Keyboard Programmatically #
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 keyboard
๐ Switch Keyboard Modes #
You 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.
๐ Built-in Mobile and Desktop Layouts #
By default, the keyboard selects the appropriate layout based on platform:
MobileKeyboardLayout
for Android/iOS/FuchsiaDesktopKeyboardLayout
for macOS/Windows/Linux
You can also explicitly set a custom layout:
OnscreenKeyboard.builder(
layout: const MobileKeyboardLayout(), // or your custom layout
// ...more options
),
๐น Listen to Key Events #
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) {
// ...
}
}
๐จ Customization #
- 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.
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: ..,
),
);
๐ Repository #
Browse the source code and contribute here: ๐ https://github.com/albinpk/flutter_onscreen_keyboard
๐ ๏ธ Contributing #
Contributions, issues, and feature requests are welcome! See the CONTRIBUTING.md for guidelines.
๐ License #
This project is licensed under the MIT License.
๐ Credits #
Created and maintained by Albin PK. If you find this package useful, consider giving it a โญ on GitHub and a like on pub.dev!