Closed
Description
Proposal: Opportunity to declare classes inside other classes like in Kotlin:
sealed class SomeState<T>{
class Loading<T> : SomeState<T>()
data class Success<T>(val value:T) : SomeState<T>()
data class Error<T>(val error: Throwable) : SomeState<T>()
}
fun handle(state: SomeState<Int>){
when(state){
is SomeState.Error -> TODO()
is SomeState.Loading -> TODO()
is SomeState.Success -> TODO()
}
}
Dart:
sealed class SomeState<T> {
class Loading<T> extends SomeState<T> {}
class Success<T> extends SomeState<T> {
final T value;
Success(this.value);
}
class Error<T> extends SomeState<T> {
final Object error;
Error(this.error);
}
}
void handle(SomeState<int> state) {
switch (state) {
case SomeState.Loading():
case SomeState.Success():
case SomeState.Error():
}
}
Use case: to increase readability especially for sealed classes
Without such syntax we should always add "noisy" prefix/suffix to sealed subclasses' names especially when super class has long name:
sealed class SomeVeryVeryVeryLongNamedState<T> {}
class SomeVeryVeryVeryLongNamedStateLoading<T>
extends SomeVeryVeryVeryLongNamedState<T> {}
class SomeVeryVeryVeryLongNamedStateSuccess<T>
extends SomeVeryVeryVeryLongNamedState<T> {
final T value;
SomeVeryVeryVeryLongNamedStateSuccess(this.value);
}
class SomeVeryVeryVeryLongNamedStateError<T>
extends SomeVeryVeryVeryLongNamedState<T> {
final Object error;
SomeVeryVeryVeryLongNamedStateError(this.error);
}
void handle(SomeVeryVeryVeryLongNamedState<int> state) {
switch (state) {
case SomeVeryVeryVeryLongNamedStateLoading():
case SomeVeryVeryVeryLongNamedStateSuccess():
case SomeVeryVeryVeryLongNamedStateError():
}
}