1
+ import 'package:flutter/material.dart' ;
2
+ import 'package:flutter/rendering.dart' ;
3
+
4
+ class RenderDots extends RenderConstrainedBox {
5
+ RenderDots () : super (additionalConstraints: const BoxConstraints .expand ());
6
+
7
+ @override
8
+ bool hitTestSelf (Offset position) => true ;
9
+
10
+ final Map <int , Offset > _dots = < int , Offset > {};
11
+
12
+ @override
13
+ void handleEvent (PointerEvent event, BoxHitTestEntry entry){
14
+ if (event is PointerDownEvent || event is PointerMoveEvent ){
15
+ _dots[event.pointer] = event.position;
16
+ markNeedsPaint ();
17
+ } else if (event is PointerUpEvent || event is PointerCancelEvent ){
18
+ _dots.remove (event.pointer);
19
+ markNeedsLayout ();
20
+ }
21
+ }
22
+
23
+ @override
24
+ void paint (PaintingContext context, Offset offset){
25
+ final Canvas canvas = context.canvas;
26
+ canvas.drawRect (offset & size, Paint ()..color = const Color (0xFF0000FF ));
27
+
28
+ final Paint paint = Paint ()..color = const Color (0xFF00FF00 );
29
+ for (Offset point in _dots.values){
30
+ canvas.drawCircle (point, 50.0 , paint);
31
+ }
32
+ super .paint (context, offset);
33
+ }
34
+ }
35
+
36
+ class Dots extends SingleChildRenderObjectWidget {
37
+ const Dots ({Key key, Widget child}): super (key: key,child: child);
38
+
39
+ @override
40
+ RenderDots createRenderObject (BuildContext context) => RenderDots ();
41
+ }
42
+
43
+ class CustomRenderBox extends StatelessWidget {
44
+ @override
45
+ Widget build (BuildContext context) {
46
+ return new Scaffold (
47
+ appBar: new AppBar (
48
+ title: new Text ('Custom Render Box' ),
49
+ ),
50
+ body: SafeArea (
51
+ child: const Directionality (
52
+ textDirection: TextDirection .ltr,
53
+ child: Dots (
54
+ child: Center (
55
+ child: Text ('TOUCH ME!' ),
56
+ )
57
+ )
58
+ ),
59
+ )
60
+ );
61
+ }
62
+ }
0 commit comments