Skip to content

Commit c029b5e

Browse files
committed
+5, overlay fix, device ext
1 parent c7b53ee commit c029b5e

7 files changed

Lines changed: 218 additions & 91 deletions

File tree

lib/control.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
library flutter_control;
22

3+
import 'dart:ui';
4+
35
import 'package:flutter/scheduler.dart';
46
import 'package:flutter_control/control.dart';
57

@@ -24,6 +26,8 @@ part 'src/hook/animation_controller.dart';
2426

2527
part 'src/hook/control_hook.dart';
2628

29+
part 'src/hook/device.dart';
30+
2731
part 'src/hook/overlay_extension.dart';
2832

2933
part 'src/hook/scroll_controller.dart';

lib/src/hook/device.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
part of flutter_control;
2+
3+
extension MediaViewExt on BuildContext {
4+
FlutterView get view => View.of(this);
5+
6+
MediaQueryData get media => MediaQueryData.fromView(view);
7+
}
8+
9+
extension FlutterViewExt on FlutterView {
10+
Size get viewSize => physicalSize / devicePixelRatio;
11+
}
12+
13+
extension DisplayExt on Display {
14+
Size get viewSize => size / devicePixelRatio;
15+
}

lib/src/hook/overlay_extension.dart

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,90 @@
11
part of flutter_control;
22

3-
extension OverlayExtension on CoreContext {
3+
extension OverlayControl on CoreContext {
44
OverlayEntry? showOverlay({
5-
required CoreContext context,
65
required dynamic key,
76
required Widget Function(Rect parent) builder,
87
GlobalKey? parentKey,
8+
BuildContext? parentContext,
99
bool barrierDismissible = true,
1010
}) {
11-
final overlay = Overlay.of(context);
11+
if (!mounted) {
12+
return null;
13+
}
14+
15+
final overlay = Overlay.of(this);
1216

13-
if (context.args.containsKey(ObjectTag.of(key))) {
14-
return getOverlay(context, key);
17+
if (args.containsKey(ObjectTag.of(key))) {
18+
return getOverlay(key);
1519
}
1620

1721
if (key is GlobalKey && parentKey == null) {
1822
parentKey = key;
1923
}
2024

21-
final box = (parentKey?.currentState?.context.findRenderObject() ??
22-
context.findRenderObject()) as RenderBox;
23-
final location = box.localToGlobal(Offset.zero);
24-
final size = box.size;
25+
parentContext ??= parentKey?.currentState?.context;
26+
27+
Widget build() {
28+
final box = (parentContext?.findRenderObject() ?? findRenderObject())
29+
as RenderBox?;
2530

26-
final child = builder(
27-
Rect.fromLTWH(location.dx, location.dy, size.width, size.height));
31+
if (box == null) {
32+
final size = view.viewSize;
33+
return builder(Rect.fromLTWH(0.0, 0.0, size.width, size.height));
34+
}
35+
36+
final location = box.localToGlobal(Offset.zero);
37+
final size = box.size;
38+
39+
return builder(
40+
Rect.fromLTWH(location.dx, location.dy, size.width, size.height));
41+
}
2842

2943
final entry = OverlayEntry(
3044
builder: (_) => barrierDismissible
3145
? Stack(
3246
children: [
3347
GestureDetector(
34-
onTap: () => hideOverlay(context, key),
48+
onTap: () => hideOverlay(key),
3549
),
36-
child,
50+
build(),
3751
],
3852
)
39-
: child,
53+
: build(),
4054
);
4155

42-
context.args.add(key: ObjectTag.of(key), value: entry);
56+
args.add(key: ObjectTag.of(key), value: entry);
4357

4458
overlay.insert(entry);
4559

4660
return entry;
4761
}
4862

49-
OverlayEntry? getOverlay(CoreContext context, dynamic key) =>
50-
context.args.get<OverlayEntry>(key: ObjectTag.of(key));
63+
OverlayEntry? getOverlay(dynamic key) =>
64+
args.get<OverlayEntry>(key: ObjectTag.of(key));
5165

52-
bool hideOverlay(CoreContext context, dynamic key) {
53-
final overlay = getOverlay(context, key);
66+
bool hideOverlay(dynamic key) {
67+
final overlay = getOverlay(key);
5468

5569
if (overlay != null) {
5670
overlay.remove();
57-
context.args.remove(key: ObjectTag.of(key));
71+
args.remove(key: ObjectTag.of(key));
5872

5973
return true;
6074
}
6175

6276
return false;
6377
}
6478

65-
bool clearOverlays(CoreContext context) {
66-
final items = context.args.getAll<OverlayEntry>();
79+
bool clearOverlays() {
80+
final items = args.getAll<OverlayEntry>();
6781

6882
if (items.isNotEmpty) {
69-
items.forEach((element) {
83+
for (final element in items) {
7084
element.remove();
71-
});
85+
}
7286

73-
context.args.removeAll<OverlayEntry>();
87+
args.removeAll<OverlayEntry>();
7488

7589
return true;
7690
}

modules/control_annotations/test/entity_test.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,6 @@ class TestParser extends ParseEntity {
3232
}
3333

3434
class TestValue extends ParseValue {
35-
const TestValue(String key) : super(key: key, converter: const TestConverter());
35+
const TestValue(String key)
36+
: super(key: key, converter: const TestConverter());
3637
}

modules/control_builder/lib/control_builder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ import 'package:source_gen/source_gen.dart';
33

44
import 'src/parse_generator.dart';
55

6-
Builder parse(BuilderOptions options) => PartBuilder([ParseGenerator()], '.g.dart');
6+
Builder parse(BuilderOptions options) =>
7+
PartBuilder([ParseGenerator()], '.g.dart');

0 commit comments

Comments
 (0)