Skip to content

Commit 9a48ad4

Browse files
committed
feat: add new converters for BoxConstraints, Alignment, and Matrix4
1 parent 7c3e296 commit 9a48ad4

File tree

7 files changed

+182
-107
lines changed

7 files changed

+182
-107
lines changed

docs/flutter/converters.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ The dogs package for Flutter provides a set of sdk specific converters for commo
22
is a comprehensive list of all converters provided by the package:
33

44
- `Color` as a hex string in the format `#RRGGBB` or `#AARRGGBB`
5-
- `Offset`, `Size`, `Rect`, `RRect`, `EdgeInsets`, `Radius`, `BorderRadius`
5+
- `Offset`, `Size`, `Rect`, `RRect`, `EdgeInsets`, `Radius`, `BorderRadius`
6+
- `LogicalKeyboardKey`, `SingleActivator`

docs/flutter/index.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,9 @@
22
icon: simple/flutter
33
---
44

5-
# Flutter
5+
# Flutter ![Static Badge](https://img.shields.io/badge/experimental-orange)
6+
7+
This package provides Flutter specific functionality for the Dogs serialization library, including:
8+
9+
- [Databinding](binding) and Form Generation
10+
- [Converters](converters) for Flutter specific types

packages/dogs_flutter/lib/converters/geometric.dart

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:dogs_core/dogs_converter_utils.dart';
22
import 'package:dogs_core/dogs_core.dart';
3-
import 'package:flutter/painting.dart';
3+
import 'package:dogs_core/dogs_schema.dart';
4+
import 'package:flutter/material.dart';
45

56
List<double> _parseDoubleTuple4(dynamic value, DogEngine engine, DogConverter converter) {
67
var list = converter.expects<List>(value, engine);
@@ -32,6 +33,10 @@ class FlutterOffsetConverter extends SimpleDogConverter<Offset> {
3233
serialize(Offset value, DogEngine engine) {
3334
return <String, dynamic>{"dx": value.dx, "dy": value.dy};
3435
}
36+
37+
@override
38+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) =>
39+
object({"dx": number(), "dy": number()});
3540
}
3641

3742
@linkSerializer
@@ -48,6 +53,10 @@ class FlutterSizeConverter extends SimpleDogConverter<Size> {
4853
serialize(Size value, DogEngine engine) {
4954
return <String, dynamic>{"width": value.width, "height": value.height};
5055
}
56+
57+
@override
58+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) =>
59+
object({"width": number(), "height": number()});
5160
}
5261

5362
@linkSerializer
@@ -64,6 +73,9 @@ class FlutterRectConverter extends SimpleDogConverter<Rect> {
6473
serialize(Rect value, DogEngine engine) {
6574
return [value.left, value.top, value.right, value.bottom];
6675
}
76+
77+
@override
78+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) => number().array().length(4);
6779
}
6880

6981
@linkSerializer
@@ -80,6 +92,9 @@ class FlutterEdgeInsetsConverter extends SimpleDogConverter<EdgeInsets> {
8092
serialize(EdgeInsets value, DogEngine engine) {
8193
return [value.left, value.top, value.right, value.bottom];
8294
}
95+
96+
@override
97+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) => number().array().length(4);
8398
}
8499

85100
@linkSerializer
@@ -105,6 +120,9 @@ class FlutterRadiusConverter extends SimpleDogConverter<Radius> {
105120
}
106121
throw DogSerializerException(message: "Invalid radius value");
107122
}
123+
124+
@override
125+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) => number();
108126
}
109127

110128
@linkSerializer
@@ -126,6 +144,9 @@ class FlutterBorderRadiusConverter extends SimpleDogConverter<BorderRadius> {
126144
serialize(BorderRadius value, DogEngine engine) {
127145
return [value.topLeft.x, value.topRight.x, value.bottomLeft.x, value.bottomRight.x];
128146
}
147+
148+
@override
149+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) => number().array().length(4);
129150
}
130151

131152
@linkSerializer
@@ -160,4 +181,74 @@ class FlutterRRectConverter extends SimpleDogConverter<RRect> {
160181
),
161182
};
162183
}
184+
185+
@override
186+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) =>
187+
object({"dimensions": engine.describe<Rect>(), "radii": engine.describe<BorderRadius>()});
188+
}
189+
190+
@linkSerializer
191+
class FlutterBoxConstraintsConverter extends SimpleDogConverter<BoxConstraints> {
192+
FlutterBoxConstraintsConverter() : super(serialName: "FLBoxConstraints");
193+
194+
@override
195+
BoxConstraints deserialize(value, DogEngine engine) {
196+
final [minWidth, maxWidth, minHeight, maxHeight] = _parseDoubleTuple4(value, engine, this);
197+
return BoxConstraints(
198+
minWidth: minWidth,
199+
maxWidth: maxWidth,
200+
minHeight: minHeight,
201+
maxHeight: maxHeight,
202+
);
203+
}
204+
205+
@override
206+
serialize(BoxConstraints value, DogEngine engine) {
207+
return [value.minWidth, value.maxWidth, value.minHeight, value.maxHeight];
208+
}
209+
210+
@override
211+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) => number().array().length(4);
212+
}
213+
214+
@linkSerializer
215+
class FlutterAlignmentConverter extends SimpleDogConverter<Alignment> {
216+
FlutterAlignmentConverter() : super(serialName: "FLAlignment");
217+
218+
@override
219+
Alignment deserialize(value, DogEngine engine) {
220+
var map = readAsMap(value, engine);
221+
return Alignment(map.read<double>("x"), map.read<double>("y"));
222+
}
223+
224+
@override
225+
serialize(Alignment value, DogEngine engine) {
226+
return <String, dynamic>{"x": value.x, "y": value.y};
227+
}
228+
229+
@override
230+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) =>
231+
object({"x": number(), "y": number()});
232+
}
233+
234+
@linkSerializer
235+
class FlutterMatrix4Converter extends SimpleDogConverter<Matrix4> {
236+
FlutterMatrix4Converter() : super(serialName: "FLMatrix4");
237+
238+
@override
239+
Matrix4 deserialize(value, DogEngine engine) {
240+
var list = expects<List>(value, engine);
241+
if (list.length != 16) {
242+
throw DogSerializerException(message: "Expected list of 16 numeric values", converter: this);
243+
}
244+
return Matrix4.fromList(list.map((e) => readAs<double>(e, engine)).toList());
245+
}
246+
247+
@override
248+
serialize(Matrix4 value, DogEngine engine) {
249+
return value.storage;
250+
}
251+
252+
@override
253+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) => number().array().length(16);
163254
}

packages/dogs_flutter/lib/converters/various.dart

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:dogs_core/dogs_converter_utils.dart';
22
import 'package:dogs_core/dogs_core.dart';
3+
import 'package:dogs_core/dogs_schema.dart';
34
import 'package:flutter/material.dart';
45
import 'package:flutter/services.dart';
56

@@ -66,9 +67,14 @@ class FlutterLogicalKeyConverter extends SimpleDogConverter<LogicalKeyboardKey>
6667
}
6768

6869
@override
69-
serialize(LogicalKeyboardKey value, DogEngine engine) {
70-
return {"id": value.keyId, "label": value.keyLabel};
71-
}
70+
serialize(LogicalKeyboardKey value, DogEngine engine) => {
71+
"id": value.keyId,
72+
"label": value.keyLabel,
73+
};
74+
75+
@override
76+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) =>
77+
object({"id": integer(), "label": string()});
7278
}
7379

7480
@linkSerializer
@@ -90,15 +96,24 @@ class FlutterSingleActivatorConverter extends SimpleDogConverter<SingleActivator
9096
}
9197

9298
@override
93-
serialize(SingleActivator value, DogEngine engine) {
94-
return {
95-
"k": engine.toNative<LogicalKeyboardKey>(value.trigger),
96-
"c": value.control,
97-
"s": value.shift,
98-
"a": value.alt,
99-
"m": value.meta,
100-
"r": value.includeRepeats,
101-
"n": value.numLock.index,
102-
};
103-
}
99+
serialize(SingleActivator value, DogEngine engine) => {
100+
"k": engine.toNative<LogicalKeyboardKey>(value.trigger),
101+
"c": value.control,
102+
"s": value.shift,
103+
"a": value.alt,
104+
"m": value.meta,
105+
"r": value.includeRepeats,
106+
"n": value.numLock.index,
107+
};
108+
109+
@override
110+
SchemaType describeOutput(DogEngine engine, SchemaConfig config) => object({
111+
"k": engine.describe<LogicalKeyboardKey>(),
112+
"c": boolean(),
113+
"s": boolean(),
114+
"a": boolean(),
115+
"m": boolean(),
116+
"r": boolean(),
117+
"n": integer(),
118+
});
104119
}

packages/dogs_flutter/lib/databinding/style.conv.g.dart

Lines changed: 12 additions & 88 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/dogs_flutter/lib/dogs.g.dart

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)