overlay.dart 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(App());
  4. }
  5. class App extends StatelessWidget {
  6. const App({super.key});
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. home: Home(),
  11. );
  12. }
  13. }
  14. class Home extends StatelessWidget {
  15. const Home({super.key});
  16. @override
  17. Widget build(BuildContext context) {
  18. return Scaffold(
  19. body: ListView(
  20. children: [
  21. SizedBox(
  22. height: 500,
  23. ),
  24. OverlayDemo(),
  25. SizedBox(
  26. height: 2500,
  27. ),
  28. ],
  29. ),
  30. );
  31. }
  32. }
  33. class OverlayDemo extends StatefulWidget {
  34. const OverlayDemo({super.key});
  35. @override
  36. State<OverlayDemo> createState() => OverlayDemoState();
  37. }
  38. class OverlayDemoState extends State<OverlayDemo> {
  39. final overlay = OverlayPortalController();
  40. final link = LayerLink();
  41. @override
  42. Widget build(BuildContext context) {
  43. return OverlayPortal(
  44. controller: overlay,
  45. overlayChildBuilder: (context) {
  46. return CompositedTransformFollower(
  47. link: link,
  48. child: Stack(
  49. children: [
  50. Container(
  51. color: Colors.yellow,
  52. width: 100,
  53. height: 100,
  54. ),
  55. ],
  56. ),
  57. );
  58. },
  59. child: MouseRegion(
  60. onHover: (event) {
  61. setState(() {
  62. overlay.show();
  63. });
  64. },
  65. onExit: (event) {
  66. setState(() {
  67. overlay.hide();
  68. });
  69. },
  70. child: CompositedTransformTarget(
  71. link: link,
  72. child: GestureDetector(
  73. onTap: () {
  74. debugDumpLayerTree();
  75. },
  76. child: Container(
  77. color: Colors.red,
  78. width: 100,
  79. height: 100,
  80. ),
  81. ),
  82. ),
  83. ),
  84. );
  85. }
  86. }