defer_pointer
Eine Alternative zu Overlay, die es Ihnen ermöglicht, ein Widget außerhalb der Grenzen seines übergeordneten Elements einfach darzustellen und darauf zu testen.
gskinnerTeam/flutter-defer-pointer open-source repository details.
{"sdk":"flutter"}^2.0.3{"sdk":"flutter"}^1.0.0Englischer Projektschnappschuss. Aktuelle Inhalte auf GitHub.
An alternative to Overlay which allows you to easily render and hit test a widget outside its parent bounds. Based on the original idea by @shrouxm here: https://github.com/flutter/flutter/issues/75747#issuecomment-907755810
Typically in Flutter, if you offset a widget outside of it's parent bounds hit-testing will break. DeferPointer works around this issue by handing off hit-testing and (optionally) rendering to an DeferredPointerHandler widget further up the tree.
While Overlay can solve this issue to some degree, using DeferPointer offers some benefits:
This is useful for larger UI components like dropdown menus and sliding panels, as well as just small general styling tweaks.
dependencies:
defer_pointer: ^0.0.2
import 'package:defer_pointer/defer_pointer.dart';
DeferredPointerHandler somewhere above the buttons that you wish to hit-test.DeferPointer around the buttons themselves.Widget build(BuildContext context) {
return DeferredPointerHandler(
child: SizedBox(
width: 100,
height: 100,
child: Stack(clipBehavior: Clip.none, children: [
// Hang button off the bottom of the content
Positioned(
bottom: -30,
child: DeferPointer(child: _SomeBtn(false)),
),
// Content
Positioned.fill(
child: Container(
decoration: BoxDecoration(color: Colors.green, boxShadow: [
BoxShadow(color: Colors.black.withOpacity(1), blurRadius: 4, spreadRadius: 4),
]),
),
),
]))));
}
Enable paintOnTop if you need the child Widget painted on top of it's siblings. This will defer painting to the currently linked DeferredPointerHandler.
return DeferPointer(
paintOnTop: true,
child: TextButton(...));
There are 4 examples in this repo:
A simple example of offsetting 2 buttons outside their stack: https://github.com/gskinnerTeam/flutter-defer-pointer/blob/master/example/lib/examples/simple_offset_outside_parent.dart
A classic desktop/web style dropdown menu: https://github.com/gskinnerTeam/flutter-defer-pointer/blob/master/example/lib/examples/dropdown_menus.dart
A animated menu based on the Flow widget:
https://github.com/gskinnerTeam/flutter-defer-pointer/blob/master/example/lib/examples/flow_menu.dart
A auto-complete search field: https://github.com/gskinnerTeam/flutter-defer-pointer/blob/master/example/lib/examples/auto_complete.dart
By default a DeferPointer widget will look up the closest DeferredPointerHandler using it's current context. For more complicated use cases you can manually assign a link to bind a pointer to a handler:
final _deferredPointerLink = DeferredPointerHandlerLink();
...
Widget build(){
return DeferredPointerHandler(
link: _deferredPointerLink,
child: Padding(
padding: const EdgeInsets.all(20),
child: DeferPointer(
link: _deferredPointerLink,
child: ...,
)),
);
}
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.
MIT License