Search packages, repositories and app categories

Package detailsv1.2.0

focusable_control_builder

Easily create custom controls that respond correctly to mouse and keyboard.

AndroidiOSWebmacOSWindowsLinux
30-day downloads
1.7K
Likes
52
Pub points
140

Install package

flutter pub add focusable_control_builder

Package Overview

Package selection guidance compiled from public package information, community data, and project usage.

A Flutter package that simplifies the creation of custom UI controls with proper keyboard and mouse focus handling. It provides a builder pattern to manage focus states, accessibility, and input events consistently across platforms. Developers can easily implement interactive elements like buttons, sliders, or form fields that respond correctly to tab navigation, keyboard shortcuts, and pointer interactions. The package ensures a seamless user experience for assistive technologies and users relying on non-touch input methods.

Use cases

  • Creating accessible form inputs
  • Building custom interactive widgets
  • Enabling keyboard navigation in complex UIs
  • Supporting screen readers and assistive tech
  • Implementing tabbed navigation in apps
  • Designing responsive controls for desktop and web

Key features

  • Built-in focus state management
  • Keyboard event handling
  • Mouse pointer integration
  • Cross-platform consistency
  • Accessibility-ready design
  • Simple builder API

Suitable for

  • Developers building accessible apps
  • Desktop and web-focused Flutter projects
  • Teams prioritizing UX for keyboard users
  • Custom widget creators
  • Apps requiring full keyboard navigation

Considerations

  • Requires understanding of focus semantics
  • May need additional styling for visual feedback
  • Best used with semantic UI patterns
  • Not necessary for simple touch-only interfaces
  • Integration with existing focus trees may require care

Original README

Original README snapshot from the linked source repository. Visit the repository for the latest content.

focusable_control_builder

Using FocusableControlBuilder you can quickly create a new control that will work properly on all platforms and input devices.

Working "properly" entails support for:

  • tab key traversal
  • focus / rollover states
  • modified mouse cursor
  • support for keyboard shortcuts (Enter/Space by default)

Under the hood, this builder wraps the built in FocusableActionDetector and you can read there for more details about how it all works.

For more information on why you'd use these widgets, see this blog post: https://blog.gskinner.com/archives/2021/06/flutter-building-custom-components-with-focusableactiondetector.html

🔨 Installation

$ flutter pub add focusable_control_builder
⚙ Import
import 'package:focusable_control_builder/focusable_control_builder.dart';

🕹️ Usage

To create a custom button just implement the FocusableControlBuilder.builder method and assign an onPressed handler:

class MyCustomButton extends StatelessWidget {
  const MyCustomButton(this.label, {Key? key, required this.onPressed}) : super(key: key);
  final String label;
  final VoidCallback onPressed;
  @override
  Widget build(BuildContext context) {
    return FocusableControlBuilder(
        onPressed: onPressed,
        builder: (_, FocusableControlState control) {
          // Decide which colors to use, based on .isFocused and .isHovered
          Color outlineColor = control.isFocused ? Colors.black : Colors.transparent;
          Color bgColor = control.isHovered ? Colors.blue.shade100 : Colors.grey.shade200;
          // Return custom button contents
          return Container(
            padding: const EdgeInsets.all(8),
            child: Text(label),
            decoration: BoxDecoration(
              color: bgColor,
              border: Border.all(color: outlineColor, width: 1),
            ),
          );
        });
  }
}
Custom Mouse Cursor

FocusableControlBuilder will assume you want a "hand" cursor for your control, which is typically the case. If you'd like a different cursor, just assign it:

return FocusableControlBuilder(
    cursor: SystemMouseCursors.resizeDown,
    ...
);
Request Focus On Press

FocusableControlBuilder will assume you want your control to request focus when it is pressed. To disable, just set this to false:

return FocusableControlBuilder(
    requestFocusOnPress: false,
    ...
);
Custom Shortcuts

FocusableControlBuilder will create a default activation action which handles [Submit] and [Enter] keys. To create custom keyboard shortcuts you can set the .shortcuts and .actions parameters. This is a bit beyond the scope of this doc, but if you'd like to learn how, checkout the FocusableActionDetector docs which contain an example.

🐞 Bugs/Requests

If you encounter any problems please open an issue. If you feel the library is missing a feature, please raise a ticket on Github and we'll look into it. Pull request are welcome.

📃 License

MIT License

Categories

Source repository

Projects using this package

No data available yet.