Closed chimon2000 closed 4 years ago
Seems like generics could be more easily handled using classes rather than enums. What's the value added by using enums?
You have missed specifying the type with the factory constructor.
It should be
@superEnum
enum _ModelState {
@generic
@Data(fields: [DataField('data', Generic)])
Success,
@object
Error,
@object
Loading,
@object
Empty,
}
//Somewhere else in code
Stream<ModelState<int>> getSomething() {
return Stream.fromFuture(Future.value(1))
.publishReplay(maxSize: 1)
.refCount()
.map((data) => ModelState<int>.loading());
}
Dart is unable to automatically infer template types.
As for the values added by enums are brevity of the code, simplicity and cohesion with the idea of sealed classes being superlative enums. If dart had support for nested classes we could have had used classes but as per your example of sealed_unions, you have to rely on member methods to generate corresponding classes and factories. Neither it's readable nor does it make much sense.
@astralstriker makes sense, thanks for pointing out that fix! That appeared to solve my initial issue, however I encounter the same error when using startWith
Stream<ModelState<int>> getSomething() {
return Stream.fromFuture(Future.value(1))
.publishReplay(maxSize: 1)
.refCount()
.map((data) => ModelState<int>.success(data: data))
.startWith(ModelState<int>.loading());
It shouldn't matter, but I am using a more complex type and seeing the same error when I consume the observable.
return Stream.fromFuture(Future.value())
.publishReplay(maxSize: 1)
.refCount()
.map((data) => ModelState<VehicleTypeResults>.loading());
This appears to result in the same error. The only call that has worked correctly for me is success.
I believe the issue is in how non-generic classes are created with singletons. Notice the following screenshot that shows the _instance
is dynamic.
If I swap the generated code for Loading with similar code as Success the issue is resolved.
class Loading<T> extends ModelState<T> {
const Loading._() : super(_ModelState.Loading);
factory Loading() {
_instance ??= Loading._();
return _instance;
}
static Loading _instance;
}
//Becomes
class Loading<T> extends ModelState<T> {
const Loading() : super(_ModelState.Loading);
}
From what I understand, static members also cannot be referenced with generic types. See https://github.com/dart-lang/language/issues/359
When using generics, I am getting a type casting exceptions given the following example
The error:
Environment:
Dependencies: