follower.dart 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import 'package:flutter/rendering.dart';
  2. import 'package:flutter/widgets.dart';
  3. class PopoverCompositedTransformFollower extends CompositedTransformFollower {
  4. const PopoverCompositedTransformFollower({
  5. super.key,
  6. required super.link,
  7. super.showWhenUnlinked = true,
  8. super.offset = Offset.zero,
  9. super.targetAnchor = Alignment.topLeft,
  10. super.followerAnchor = Alignment.topLeft,
  11. super.child,
  12. });
  13. @override
  14. PopoverRenderFollowerLayer createRenderObject(BuildContext context) {
  15. final screenSize = MediaQuery.of(context).size;
  16. return PopoverRenderFollowerLayer(
  17. screenSize: screenSize,
  18. link: link,
  19. showWhenUnlinked: showWhenUnlinked,
  20. offset: offset,
  21. leaderAnchor: targetAnchor,
  22. followerAnchor: followerAnchor,
  23. );
  24. }
  25. @override
  26. void updateRenderObject(
  27. BuildContext context, PopoverRenderFollowerLayer renderObject) {
  28. final screenSize = MediaQuery.of(context).size;
  29. renderObject
  30. ..screenSize = screenSize
  31. ..link = link
  32. ..showWhenUnlinked = showWhenUnlinked
  33. ..offset = offset
  34. ..leaderAnchor = targetAnchor
  35. ..followerAnchor = followerAnchor;
  36. }
  37. }
  38. class PopoverRenderFollowerLayer extends RenderFollowerLayer {
  39. Size screenSize;
  40. PopoverRenderFollowerLayer({
  41. required super.link,
  42. super.showWhenUnlinked = true,
  43. super.offset = Offset.zero,
  44. super.leaderAnchor = Alignment.topLeft,
  45. super.followerAnchor = Alignment.topLeft,
  46. super.child,
  47. required this.screenSize,
  48. });
  49. @override
  50. void paint(PaintingContext context, Offset offset) {
  51. super.paint(context, offset);
  52. final global = localToGlobal(offset);
  53. if (link.leader == null) {
  54. return;
  55. }
  56. if (link.leader!.offset.dx + link.leaderSize!.width + size.width >
  57. screenSize.width) {
  58. debugPrint("over flow");
  59. }
  60. debugPrint(
  61. "right: ${link.leader!.offset.dx + link.leaderSize!.width + size.width}, screen with: ${screenSize.width}");
  62. // debugPrint(
  63. // "offset: $offset, global: $global, link: ${link.leader?.offset}, link size: ${link.leaderSize}");
  64. // debugPrint("follower size: ${this.size}, screen size: ${this.screenSize}");
  65. }
  66. }
  67. class EdgeFollowerLayer extends FollowerLayer {
  68. EdgeFollowerLayer({
  69. required super.link,
  70. super.showWhenUnlinked = true,
  71. super.unlinkedOffset = Offset.zero,
  72. super.linkedOffset = Offset.zero,
  73. });
  74. }