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

juancastillo0 / json_form / 14147619926

29 Mar 2025 04:54PM UTC coverage: 81.034% (+0.4%) from 80.605%
14147619926

push

github

juancastillo0
fix example rendering test

1739 of 2146 relevant lines covered (81.03%)

1.32 hits per line

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

91.45
/lib/src/builder/object_schema_builder.dart
1
import 'package:flutter/material.dart';
2
import 'package:json_form/json_form.dart';
3
import 'package:json_form/src/builder/general_subtitle_widget.dart';
4
import 'package:json_form/src/builder/logic/object_schema_logic.dart';
5
import 'package:json_form/src/builder/logic/widget_builder_logic.dart';
6
import 'package:json_form/src/builder/widget_builder.dart';
7
import 'package:json_form/src/fields/shared.dart';
8
import 'package:json_form/src/models/models.dart';
9

10
class ObjectSchemaBuilder extends StatefulWidget {
11
  ObjectSchemaBuilder({
1✔
12
    Key? key,
13
    required this.mainSchema,
14
    required this.schemaObject,
15
    // TODO: validate array key
16
  }) : super(key: key ?? ValueKey(schemaObject));
2✔
17

18
  final Schema mainSchema;
19
  final SchemaObject schemaObject;
20

21
  @override
1✔
22
  State<ObjectSchemaBuilder> createState() => _ObjectSchemaBuilderState();
1✔
23
}
24

25
class _ObjectSchemaBuilderState extends State<ObjectSchemaBuilder>
26
    implements JsonFormField<Map<String, Object?>> {
27
  late SchemaObject _schemaObject;
28
  late final JsonFormValue formValue;
29

30
  @override
1✔
31
  void initState() {
32
    super.initState();
1✔
33
    _schemaObject = widget.schemaObject;
3✔
34
    formValue =
1✔
35
        PrivateJsonFormController.setField(context, _schemaObject, this);
3✔
36
    syncValues();
1✔
37
  }
38

39
  @override
1✔
40
  void didUpdateWidget(covariant ObjectSchemaBuilder oldWidget) {
41
    super.didUpdateWidget(oldWidget);
1✔
42
    if (oldWidget.schemaObject != widget.schemaObject) {
4✔
43
      _schemaObject = widget.schemaObject;
×
44
      syncValues();
×
45
    }
46
  }
47

48
  void syncValues() {
1✔
49
    formValue.children.removeWhere(
3✔
50
      (c) =>
1✔
51
          _schemaObject.properties.every((p) => p.id != c.id) &&
7✔
52
              c.dependentsAddedBy.isEmpty ||
×
53
          c.parent?.schema != _schemaObject,
4✔
54
    );
55
    final added = Set.of(formValue.children.map((c) => c.id));
6✔
56
    formValue.children.addAll(
3✔
57
      _schemaObject.properties.where((p) => !added.contains(p.id)).map((e) {
8✔
58
        return JsonFormValue(
1✔
59
          id: e.id,
1✔
60
          parent: formValue,
1✔
61
          schema: e,
62
        );
63
      }),
64
    );
65
  }
66

67
  @override
1✔
68
  Widget build(BuildContext context) {
69
    final properties =
70
        _schemaObject.properties.where((p) => !p.uiSchema.hidden);
6✔
71
    final directionality = Directionality.of(context);
1✔
72
    final widgetBuilderInherited = WidgetBuilderInherited.of(context);
1✔
73
    final uiConfig = widgetBuilderInherited.uiConfig;
1✔
74
    final isTableLabel = uiConfig.labelPosition == LabelPosition.table;
2✔
75
    final objectKey = formValue.idKey;
2✔
76

77
    final Set<Schema> dependentSchemas = {};
78
    for (final property in properties) {
2✔
79
      if (property is SchemaProperty && property.dependents?.schema != null) {
3✔
80
        dependentSchemas.add(property.dependents!.schema!);
3✔
81
      }
82
    }
83
    final widths = _schemaObject.properties
2✔
84
        .where((p) => !p.uiSchema.hidden)
4✔
85
        .map((e) => e.uiSchema.width)
4✔
86
        .toSet();
1✔
87

88
    final child = Column(
1✔
89
      crossAxisAlignment: CrossAxisAlignment.start,
90
      children: [
1✔
91
        if (!isTableLabel || widget.schemaObject.parent is! SchemaArray)
4✔
92
          GeneralSubtitle(
1✔
93
            field: widget.schemaObject,
2✔
94
            mainSchema: widget.mainSchema,
2✔
95
          ),
96
        if (isTableLabel)
97
          Table(
1✔
98
            columnWidths: widths.length == 1 && widths.first != null
3✔
99
                ? {1: FixedColumnWidth(widths.first!)}
×
100
                : null,
101
            children: [
1✔
102
              ...formValue.children
2✔
103
                  .where((c) => c.schema is SchemaProperty)
4✔
104
                  .expand(
1✔
105
                (e) {
1✔
106
                  final r = (e.schema as SchemaProperty).dependents?.schema;
3✔
107
                  return r != null && e.isDependentsActive
1✔
108
                      ? [
1✔
109
                          e,
110
                          ...((r is SchemaObject) ? r.properties : [r]).map(
3✔
111
                            (s) => JsonFormValue(
2✔
112
                              id: s.id,
1✔
113
                              parent: formValue,
1✔
114
                              schema: s,
115
                            ),
116
                          ),
117
                        ]
118
                      : [e];
1✔
119
                },
120
              ).map(
1✔
121
                (e) {
1✔
122
                  final s = e.schema;
1✔
123
                  final title = uiConfig.titleAndDescriptionBuilder?.call(s) ??
1✔
124
                      Column(
1✔
125
                        crossAxisAlignment: CrossAxisAlignment.start,
126
                        children: [
1✔
127
                          const SizedBox(height: 15),
128
                          Text(
1✔
129
                            uiConfig.schemaTitleOrId(s),
1✔
130
                            style: uiConfig.fieldLabel,
1✔
131
                          ),
132
                          if (s.description != null)
1✔
133
                            Text(
×
134
                              s.description!,
×
135
                              style: uiConfig.description,
×
136
                            ),
137
                        ],
138
                      );
139
                  return TableRow(
1✔
140
                    key: JsonFormKeys.objectProperty(
1✔
141
                      JsonFormKeyPath.appendId(objectKey, e.id),
2✔
142
                    ),
143
                    children: [
1✔
144
                      if (directionality == TextDirection.ltr) title,
2✔
145
                      FormFromSchemaBuilder(
1✔
146
                        schemaObject: widget.schemaObject,
2✔
147
                        mainSchema: widget.mainSchema,
2✔
148
                        formValue: e,
149
                      ),
150
                      if (directionality == TextDirection.rtl) title,
1✔
151
                    ],
152
                  );
153
                },
154
              ),
155
            ],
156
          ),
157
        ...formValue.children
2✔
158
            .where(
1✔
159
              (p) =>
1✔
160
                  !isTableLabel ||
161
                  p.schema is! SchemaProperty &&
2✔
162
                      !dependentSchemas.contains(p.schema),
2✔
163
            )
164
            .map(
1✔
165
              (e) => FormFromSchemaBuilder(
2✔
166
                key: JsonFormKeys.objectProperty(
1✔
167
                  JsonFormKeyPath.appendId(objectKey, e.id),
2✔
168
                ),
169
                schemaObject: widget.schemaObject,
2✔
170
                mainSchema: widget.mainSchema,
2✔
171
                formValue: e,
172
              ),
173
            ),
174
      ],
175
    );
176

177
    return ObjectSchemaInherited(
1✔
178
      schemaObject: _schemaObject,
1✔
179
      listen: (value) {
1✔
180
        if (value is ObjectSchemaDependencyEvent) {
1✔
181
          setState(() => _schemaObject = value.schemaObject);
4✔
182
        }
183
      },
184
      child: _schemaObject.parent == null ? child : FormSection(child: child),
3✔
185
    );
186
  }
187

188
  @override
1✔
189
  Map<String, Object?> get value => formValue.toJson()! as Map<String, Object?>;
2✔
190
  @override
191
  final FocusNode focusNode = FocusNode();
192
  @override
1✔
193
  String get idKey => formValue.idKey;
2✔
194
  @override
×
195
  JsonSchemaInfo get property => widget.schemaObject;
×
196

197
  @override
1✔
198
  set value(Map<String, Object?> newValue) {
199
    WidgetBuilderInherited.get(context).controller.updateData(idKey, newValue);
5✔
200
    newValue.forEach((k, v) {
2✔
201
      final child = formValue.children.firstWhere((c) => c.id == k);
6✔
202
      child.value = v;
1✔
203
      child.field!.value = v;
2✔
204
    });
205
    for (final c in formValue.children) {
3✔
206
      if (!newValue.containsKey(c.id)) {
2✔
207
        c.field!.value = null;
×
208
      }
209
    }
210
  }
211
}
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