Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## [10.0.10]

- Fixes controller disposal logic

## [10.0.9]

Expand Down
8 changes: 4 additions & 4 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -188,10 +188,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
version: "1.16.0"
version: "1.17.0"
path:
dependency: transitive
description:
Expand Down Expand Up @@ -280,10 +280,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev"
source: hosted
version: "0.7.6"
version: "0.7.7"
typed_data:
dependency: transitive
description:
Expand Down
4 changes: 3 additions & 1 deletion lib/src/phone_form_field_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ class PhoneFormFieldState extends FormFieldState<PhoneNumber> {
@override
void dispose() {
controller.removeListener(_onControllerValueChanged);
controller.dispose();
if (widget.controller == null) {
controller.dispose();
}
focusNode.dispose();
super.dispose();
}
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: phone_form_field
description: Flutter phone input integrated with flutter internationalization
version: 10.0.9
version: 10.0.10
homepage: https://github.com/cedvdb/phone_form_field

environment:
Expand Down
32 changes: 32 additions & 0 deletions test/phone_form_field_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ void main() {
await tester.pump();

expect(controller.value.nsn, equals(''));
controller.dispose();
});

testWidgets('Can delete phone number with area code in parentheses',
Expand Down Expand Up @@ -207,6 +208,7 @@ void main() {

expect(find.text('(416)'), findsNothing);
expect(controller.value.nsn, equals(''));
controller.dispose();
});

testWidgets('Can enter phone number with area code', (tester) async {
Expand All @@ -224,6 +226,7 @@ void main() {

expect(find.text('+ 1'), findsOneWidget);
expect(find.text('(416)'), findsOneWidget);
controller.dispose();
});

testWidgets('Should show dial code when showDialCode is true',
Expand Down Expand Up @@ -289,6 +292,7 @@ void main() {
newValue,
equals(PhoneNumber.parse('+1 123456789')),
);
controller.dispose();
});

testWidgets('Should get value of controller as initial value',
Expand All @@ -301,6 +305,7 @@ void main() {
final PhoneFormFieldState phoneFieldState =
tester.state(find.byType(PhoneFormField));
expect(phoneFieldState.value, equals(phoneNumber));
controller.dispose();
});

testWidgets('Should change value of input when controller changes',
Expand All @@ -313,6 +318,7 @@ void main() {

expect(find.text('+ 33'), findsWidgets);
expect(find.text(controller.value.formatNsn()), findsOneWidget);
controller.dispose();
});

testWidgets(
Expand All @@ -332,6 +338,7 @@ void main() {
await tester.pump();
expect(controller.value.isoCode, equals(IsoCode.FR));
expect(controller.value.nsn, equals('488997722'));
controller.dispose();
});

testWidgets('Should call onChange', (tester) async {
Expand Down Expand Up @@ -476,6 +483,7 @@ void main() {
find.text(PhoneFieldLocalizationImplEn().requiredPhoneNumber),
findsOneWidget,
);
controller.dispose();
});

testWidgets(
Expand All @@ -495,6 +503,7 @@ void main() {
find.text(PhoneFieldLocalizationImplEn().invalidCountry),
findsOneWidget,
);
controller.dispose();
},
);

Expand Down Expand Up @@ -745,5 +754,28 @@ void main() {
expect(widget.textDirection, TextDirection.ltr);
});
});

group('Dispose controller', () {
testWidgets('Should dispose internal controller', (tester) async {
await tester.pumpWidget(getWidget());

var state =
tester.state<PhoneFormFieldState>(find.byType(PhoneFormField));

await tester.pumpWidget(Container());

expect(
() => state.controller.dispose(),
throwsA((e) => '$e'.contains(
'A TextEditingController was used after being disposed')));
});

testWidgets('Should not dispose provided controller', (tester) async {
var controller = PhoneController();
await tester.pumpWidget(getWidget(controller: controller));
await tester.pumpWidget(Container());
controller.dispose();
});
});
});
}