Skip to content

Commit 2502e7d

Browse files
fix: add deep compare to update dropdown items
1 parent 7541ae5 commit 2502e7d

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

lib/src/fields/form_builder_dropdown.dart

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter/foundation.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter_form_builder/flutter_form_builder.dart';
34

@@ -299,8 +300,28 @@ class _FormBuilderDropdownState<T>
299300
@override
300301
void didUpdateWidget(covariant FormBuilderDropdown<T> oldWidget) {
301302
super.didUpdateWidget(oldWidget);
302-
if (widget.items != oldWidget.items) {
303+
304+
final oldValues = oldWidget.items.map((e) => e.value).toList();
305+
final currentlyValues = widget.items.map((e) => e.value).toList();
306+
final oldChilds = oldWidget.items.map((e) => e.child.toString()).toList();
307+
final currentlyChilds =
308+
widget.items.map((e) => e.child.toString()).toList();
309+
310+
if ((!listEquals(oldChilds, currentlyChilds) ||
311+
!listEquals(oldValues, currentlyValues)) &&
312+
(widget.items.contains(initialValue) ||
313+
_emptyValidator<T>(initialValue))) {
303314
setValue(initialValue);
304315
}
305316
}
306317
}
318+
319+
bool _emptyValidator<T>(T? value) {
320+
if (value == null) return true;
321+
if (value is Iterable) return value.isEmpty;
322+
if (value is String) return value.isEmpty;
323+
if (value is List) return value.isEmpty;
324+
if (value is Map) return value.isEmpty;
325+
if (value is Set) return value.isEmpty;
326+
return false;
327+
}

0 commit comments

Comments
 (0)