Snippets
Created by
Daniel Zollinger
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | // What we'd like to do:
class CredentialRequestStateful extends CredentialRequest {
RequestStatus status = RequestStatus.pending;
}
// And then down-cast our returned list to be the subclass
data: res.data?.map((r) => r as CredentialRequestStateful)
// This doesn't work in Dart's type system. This might be a good thing.
// This makes an explicit copy of the decorated class's attributes.
// ## Pros: ##
// - Short
// ## Cons: ##
// - If the decorated instance changes this won't be reflected in this object
// - If a new field is added to decorated it won't be available without extending
// our decorator
class CredentialRequestStateful extends CredentialRequest {
RequestStatus status = RequestStatus.pending;
CredentialRequestStateful.fromBase(CredentialRequest r) {
id = r.id;
schemaId = r.schemaId;
connectionId = r.connectionId;
definitionId = r.definitionId;
attributeValues = r.attributeValues;
}
}
// Use `noSuchMethod` and reflection to pass any un-overriden fields or methods to
// the decorated instance.
// ## Pros: ##
// - Does exactly what a decorator should do.
// - Handles any changes to the decorated interface
// ## Cons: ##
// - Not available on web or mobile. Sigh
class CredentialRequestStateful implements CredentialRequest {
RequestStatus status = RequestStatus.pending;
final CredentialRequest request;
CredentialRequestStateful.fromBase(this.request);
dynamic noSuchMethod(Invocation invocation) {
var im = reflect(request);
return im.delegate(invocation);
}
}
// Explicitly proxy methods to our decorated instance
//
// ## Pros: ##
// - Because we treat the decorated as the interface, we'll get an error if we don't
// implement all of its public methods/fields.
// - Very explicit
// ## Cons: ##
// - OMG SO WORDY
// - Still need to manually extend.
class CredentialRequestStateful implements CredentialRequest {
RequestStatus status = RequestStatus.pending;
final CredentialRequest request;
CredentialRequestStateful.fromBase(this.request);
@override
Map<String, String> get attributeValues => request.attributeValues;
@override
set attributeValues(Map<String, String> attributeValues) {
request.attributeValues = attributeValues;
}
@override
String get connectionId => request.connectionId;
@override
set connectionId(String connectionId) {
request.connectionId = connectionId;
}
@override
String get definitionId => request.definitionId;
@override
set definitionId(String definitionId) {
request.definitionId = definitionId;
}
@override
String get id => request.id;
@override
set id(String id) {
request.id = id;
}
@override
String get schemaId => request.schemaId;
@override
set schemaId(String schemaId) {
request.schemaId = schemaId;
}
@override
Map<String, dynamic> toJson() => request.toJson();
}
|
Comments (0)
You can clone a snippet to your computer for local editing. Learn more.