follower.dart 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. if (link.leader == null) {
  53. return;
  54. }
  55. if (link.leader!.offset.dx + link.leaderSize!.width + size.width >
  56. screenSize.width) {
  57. debugPrint("over flow");
  58. }
  59. debugPrint(
  60. "right: ${link.leader!.offset.dx + link.leaderSize!.width + size.width}, screen with: ${screenSize.width}");
  61. }
  62. }
  63. class EdgeFollowerLayer extends FollowerLayer {
  64. EdgeFollowerLayer({
  65. required super.link,
  66. super.showWhenUnlinked = true,
  67. super.unlinkedOffset = Offset.zero,
  68. super.linkedOffset = Offset.zero,
  69. });
  70. }