Hi,
I am really new to this language and I am working on a flutter project where I find the code too verbose.
For instance inside a part of the code I can see 2 classes with methods defined like this:
```
@freezed
class RestartVideoRequest with _$RestartVideoRequest {
const RestartVideoRequest._();
factory RestartVideoRequest({
@JsonKey(defaultValue: 'restartVideo') @Default('restartVideo') String cmd,
required int id,
}) = _RestartVideoRequest;
factory RestartVideoRequest.fromJson(Map<String, dynamic> json) =>
_$RestartVideoRequestFromJson(json);
String get command => jsonEncode(toJson());
}
/////////////////////////////////////////////////
@freezed
class StopVideoRequest with _$StopVideoRequest {
const StopVideoRequest._();
factory StopVideoRequest({
@JsonKey(defaultValue: 'stopVideo') @Default('stopVideo') String cmd,
required int id,
}) = _StopVideoRequest;
factory StopVideoRequest.fromJson(Map<String, dynamic> json) => _$StopVideoRequestFromJson(json);
String get command => jsonEncode(toJson());
}
```
So the only differrences are the types (
RestartVideoRequest vs
StopVideoRequest) and the string passed to the factory constructor ( 'restartVideo' vs '
stopVideo'.
Wouldn't be possible to declare some kind of generic class or method to factorize it ?
I have the same problem with the calling method that duplicate the code like this:
```
Future<StopVideoResponse> stopVideo() {
final id = cmdId;
final completer = Completer<StopVideoResponse>();
_channel.sink.add(StopVideoRequest(id: id).command);
_stream.where((data) => responseIdFilter(id, data)).listen((data) {
try {
completer.complete(StopVideoResponse.fromString(data));
} catch (e) {
completer.completeError(e);
}
}).onError((e) {
completer.completeError(e);
});
_stream.where((data) => responseErrorFilter(id, data)).listen((message) {
try {
completer.completeError(ErrorResponse.fromString(message));
} catch (e) {
completer.completeError(e);
}
}).onError((e) {
completer.completeError(e);
});
return completer.future;
}
Future<RestartVideoResponse> restartVideo() {
final id = cmdId;
final completer = Completer<RestartVideoResponse>();
_channel.sink.add(RestartVideoRequest(id: id).command);
_stream.where((data) => responseIdFilter(id, data)).listen((data) {
try {
completer.complete(RestartVideoResponse.fromString(data));
} catch (e) {
completer.completeError(e);
}
}).onError((e) {
completer.completeError(e);
});
_stream.where((data) => responseErrorFilter(id, data)).listen((message) {
try {
completer.completeError(ErrorResponse.fromString(message));
} catch (e) {
completer.completeError(e);
}
}).onError((e) {
completer.completeError(e);
});
return completer.future;
}
```
I am sure it should be possible to factorize all this stuff, I Started some abstract generic class but at the end it never works...