Skip to content

Nested class declaration #56625

Closed
Closed
@feduke-nukem

Description

@feduke-nukem

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():
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-languageDart language related items (some items might be better tracked at github.com/dart-lang/language).triage-automationSee https://github.com/dart-lang/ecosystem/tree/main/pkgs/sdk_triage_bot.type-enhancementA request for a change that isn't a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions