Skip to content

Commit 9abbe70

Browse files
committed
fix nullable function field
1 parent 5ec95dc commit 9abbe70

4 files changed

Lines changed: 138 additions & 4 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import 'package:dart_mappable/dart_mappable.dart';
2+
import 'package:test/test.dart';
3+
4+
part 'function_fields_test.mapper.dart';
5+
6+
@MappableClass(generateMethods: GenerateMethods.copy | GenerateMethods.equals |GenerateMethods.stringify)
7+
class Example with ExampleMappable {
8+
const Example({required this.functionField});
9+
10+
final int Function(int)? functionField;
11+
}
12+
13+
void main() {
14+
15+
group('function fields', () {
16+
17+
18+
test('should check equality with function field', () {
19+
int fn(int x) => x + 1;
20+
21+
var example1 = Example(functionField: fn);
22+
var example2 = Example(functionField:fn);
23+
expect(example1, equals(example2));
24+
});
25+
26+
test('should stringify with function field', () {
27+
var example = Example(functionField: (x) => x + 1);
28+
expect(example.toString(), equals('Example(functionField: Closure: (int) => int)'));
29+
});
30+
31+
test('should check equality with null function field', () {
32+
var example1 = Example(functionField: null);
33+
var example2 = Example(functionField: null);
34+
expect(example1, equals(example2));
35+
});
36+
37+
test('should stringify with null function field', () {
38+
var example = Example(functionField: null);
39+
expect(example.toString(), equals('Example(functionField: null)'));
40+
});
41+
});
42+
}

packages/dart_mappable/test/equality/function_fields_test.mapper.dart

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

packages/dart_mappable_builder/lib/src/elements/field/class_mapper_field_element.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class ClassMapperFieldElement extends MapperFieldElement {
5050
@override
5151
late final String staticGetterType = () {
5252
if (resolvedType is FunctionType) {
53-
return 'Function';
53+
return 'Function${resolvedType.isNullable ? '?' : ''}';
5454
}
5555
return parent.parent.prefixedType(resolvedType, resolveBounds: true);
5656
}();
@@ -63,7 +63,7 @@ class ClassMapperFieldElement extends MapperFieldElement {
6363
@override
6464
late final String staticArgType = () {
6565
if (resolvedType is FunctionType) {
66-
return 'Function';
66+
return 'Function${resolvedType.isNullable ? '?' : ''}';
6767
}
6868
return parent.parent.prefixedType(param?.type ?? resolvedType,
6969
withNullability: false, resolveBounds: true);

packages/dart_mappable_builder/lib/src/generators/extensions/fields_extension.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ extension FieldsExtension<T extends InterfaceMapperElement>
1010
if (f.needsGetter) {
1111
output.write(
1212
' static ${f.staticGetterType} _\$${f.name}(${element.prefixedClassName} v) => ');
13-
if (f.staticGetterType == 'Function') {
14-
output.write('(v as dynamic).${f.name} as Function;\n');
13+
if (f.staticGetterType == 'Function' || f.staticGetterType == 'Function?') {
14+
output.write('(v as dynamic).${f.name} as ${f.staticGetterType};\n');
1515
} else {
1616
output.write('v.${f.name};\n');
1717
}

0 commit comments

Comments
 (0)