• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Duit-Foundation / flutter_duit / 19115039532

05 Nov 2025 08:15PM UTC coverage: 86.358% (+8.9%) from 77.409%
19115039532

push

github

web-flow
major: flutter_duit v4 (#310)

2151 of 2405 new or added lines in 109 files covered. (89.44%)

36 existing lines in 7 files now uncovered.

3773 of 4369 relevant lines covered (86.36%)

35.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.92
/lib/src/ui/widgets/transform.dart
1
import "package:duit_kernel/duit_kernel.dart";
2
import "package:flutter/material.dart";
3
import "package:flutter_duit/flutter_duit.dart";
4

5
enum _TransformType {
6
  scale,
7
  rotate,
8
  translate,
9
  flip;
10

11
  static _TransformType fromString(String type) {
4✔
12
    return _TransformType.values.firstWhere(
4✔
13
      (e) => e.name == type,
12✔
NEW
14
      orElse: () => _TransformType.scale,
×
15
    );
16
  }
17
}
18

19
class DuitTransform extends StatelessWidget with AnimatedAttributes {
20
  final ViewAttribute attributes;
21
  final Widget child;
22

23
  const DuitTransform({
4✔
24
    super.key,
25
    required this.attributes,
26
    required this.child,
27
  });
28

29
  @override
4✔
30
  Widget build(BuildContext context) {
31
    final attrs = mergeWithDataSource(
4✔
32
      context,
33
      attributes.payload,
8✔
34
    );
35

36
    final type = _TransformType.fromString(attrs.getString(key: "type"));
8✔
37

38
    final transformData = DuitDataSource(attrs["data"]);
8✔
39

40
    switch (type) {
41
      case _TransformType.scale:
4✔
42
        return Transform.scale(
4✔
43
          key: Key(attributes.id),
12✔
44
          scale: transformData.tryGetDouble(key: "scale"),
4✔
45
          scaleX: transformData.tryGetDouble(key: "scaleX"),
4✔
46
          scaleY: transformData.tryGetDouble(key: "scaleY"),
4✔
47
          origin: transformData.offset(key: "origin"),
4✔
48
          alignment: transformData.alignment(),
4✔
49
          transformHitTests: attrs.getBool(
4✔
50
            "transformHitTests",
51
            defaultValue: true,
52
          ),
53
          filterQuality: transformData.filterQuality(),
4✔
54
          child: child,
4✔
55
        );
56
      case _TransformType.rotate:
4✔
57
        return Transform.rotate(
4✔
58
          key: Key(attributes.id),
12✔
59
          angle: transformData.getDouble(key: "angle"),
4✔
60
          origin: transformData.offset(),
4✔
61
          alignment: transformData.alignment(),
4✔
62
          transformHitTests: transformData.getBool(
4✔
63
            "transformHitTests",
64
            defaultValue: true,
65
          ),
66
          filterQuality: transformData.filterQuality(),
4✔
67
          child: child,
4✔
68
        );
69
      case _TransformType.translate:
4✔
70
        return Transform.translate(
4✔
71
          key: Key(attributes.id),
12✔
72
          offset: transformData.offset(defaultValue: Offset.zero)!,
4✔
73
          transformHitTests: transformData.getBool(
4✔
74
            "transformHitTests",
75
            defaultValue: true,
76
          ),
77
          filterQuality: transformData.filterQuality(),
4✔
78
          child: child,
4✔
79
        );
80
      case _TransformType.flip:
4✔
81
        return Transform.flip(
4✔
82
          key: Key(attributes.id),
12✔
83
          flipX: transformData.getBool("flipX"),
4✔
84
          flipY: transformData.getBool("flipY"),
4✔
85
          transformHitTests: transformData.getBool(
4✔
86
            "transformHitTests",
87
            defaultValue: true,
88
          ),
89
          filterQuality: transformData.filterQuality(),
4✔
90
          origin: transformData.offset(),
4✔
91
          child: child,
4✔
92
        );
93
    }
94
  }
95
}
96

97
class DuitControlledTransform extends StatefulWidget with AnimatedAttributes {
98
  final UIElementController controller;
99
  final Widget child;
100

101
  const DuitControlledTransform({
4✔
102
    super.key,
103
    required this.child,
104
    required this.controller,
105
  });
106

107
  @override
4✔
108
  State<DuitControlledTransform> createState() =>
109
      _DuitControlledTransformState();
4✔
110
}
111

112
class _DuitControlledTransformState extends State<DuitControlledTransform>
113
    with ViewControllerChangeListener {
114
  @override
4✔
115
  void initState() {
116
    attachStateToController(widget.controller);
12✔
117
    super.initState();
4✔
118
  }
119

120
  @override
4✔
121
  Widget build(BuildContext context) {
122
    final attrs = widget.mergeWithDataSource(
8✔
123
      context,
124
      attributes,
4✔
125
    );
126
    final type = _TransformType.fromString(attrs.getString(key: "type"));
8✔
127

128
    final transformData = DuitDataSource(attrs["data"]);
8✔
129

130
    switch (type) {
131
      case _TransformType.scale:
4✔
132
        return Transform.scale(
4✔
133
          key: Key(widget.controller.id),
16✔
134
          scale: transformData.tryGetDouble(key: "scale"),
4✔
135
          scaleX: transformData.tryGetDouble(key: "scaleX"),
4✔
136
          scaleY: transformData.tryGetDouble(key: "scaleY"),
4✔
137
          origin: transformData.offset(key: "origin"),
4✔
138
          alignment: transformData.alignment(),
4✔
139
          transformHitTests: transformData.getBool(
4✔
140
            "transformHitTests",
141
            defaultValue: true,
142
          ),
143
          filterQuality: transformData.filterQuality(),
4✔
144
          child: widget.child,
8✔
145
        );
146
      case _TransformType.rotate:
4✔
147
        return Transform.rotate(
4✔
148
          key: Key(widget.controller.id),
16✔
149
          angle: transformData.getDouble(key: "angle"),
4✔
150
          origin: transformData.offset(),
4✔
151
          alignment: transformData.alignment(),
4✔
152
          transformHitTests: transformData.getBool(
4✔
153
            "transformHitTests",
154
            defaultValue: true,
155
          ),
156
          filterQuality: transformData.filterQuality(),
4✔
157
          child: widget.child,
8✔
158
        );
159
      case _TransformType.translate:
4✔
160
        return Transform.translate(
4✔
161
          key: Key(widget.controller.id),
16✔
162
          offset: transformData.offset(defaultValue: Offset.zero)!,
4✔
163
          transformHitTests: transformData.getBool(
4✔
164
            "transformHitTests",
165
            defaultValue: true,
166
          ),
167
          filterQuality: transformData.filterQuality(),
4✔
168
          child: widget.child,
8✔
169
        );
170
      case _TransformType.flip:
4✔
171
        return Transform.flip(
4✔
172
          key: Key(widget.controller.id),
16✔
173
          flipX: transformData.getBool("flipX"),
4✔
174
          flipY: transformData.getBool("flipY"),
4✔
175
          transformHitTests: transformData.getBool(
4✔
176
            "transformHitTests",
177
            defaultValue: true,
178
          ),
179
          filterQuality: transformData.filterQuality(),
4✔
180
          origin: transformData.offset(),
4✔
181
          child: widget.child,
8✔
182
        );
183
    }
184
  }
185
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc