使用新的 Dart seal-class 功能,是否可以进行嵌套切换?

Cha*_*age 6 dart sealed-class

我有一个 FailureOrSuccess 的密封类,其中包含 Success 和 Failure.ch 的子类

Failure 子类也是一个密封类,具有针对不同类型故障的多个子类。

我想要一个在失败和成功之间切换的 switch 语句,并且在失败代码块内有另一个允许我在不同失败选项之间切换的 switch 语句?

是否可以使用嵌套密封类来做到这一点?

(这是我下面尝试做的一个示例,尽管这不起作用)。

switch (state.authFailureOrSuccessOption) {
          case Success(): {
            context.router.replace(const DailyRoute());
          }
          case Failure(): {
            String text;

            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text(switch (???) {
                  case CancelledByUser:
                    return 'Cancelled';
                  case ServerError:
                    return 'Server Error';
                  case EmailAlreadyInUse:
                    return 'Email already in use';
                  case InvalidEmailAndPasswordCombination:
                    return 'Invalid email and password combination';
                  case UnknownError:
                    return 'An unknown error occurred';
                }),));
          }
        }
Run Code Online (Sandbox Code Playgroud)

这是我的密封类列表供参考:

// Overall Class
sealed class FailureOrSuccess {
  const FailureOrSuccess();
}

    // Level 2 Subclass
    class Success extends FailureOrSuccess {
      const Success();
    }

    sealed class Failure extends FailureOrSuccess {
      const Failure();
    }

        // Level 3 Subclass
        sealed class AuthFailure extends Failure {
          const AuthFailure();
        }

            // Leven 4 Subclasses of AuthFailure
            class CancelledByUser extends AuthFailure {
              const CancelledByUser();
            }

            class ServerError extends AuthFailure {
              const ServerError();
            }

            class EmailAlreadyInUse extends AuthFailure {
              const EmailAlreadyInUse();
            }

            class InvalidEmailAndPasswordCombination extends AuthFailure {
              const InvalidEmailAndPasswordCombination();
            }

            class UnknownError extends AuthFailure {
              const UnknownError();
            }
Run Code Online (Sandbox Code Playgroud)

lrn*_*lrn 4

是的。

详尽性检查算法尚未完全实现,但它的目的是使像上面这样的类层次结构能够工作。

不过,您需要以case不同的方式编写模式。

用于:

  case CancelledByUser _:
  // or
  case CancelledByUser():
Run Code Online (Sandbox Code Playgroud)

实际上是case CancelledByUser:将开关值与Type对象的类型进行比较CancelledByUser(这永远不会成功,因为该CancelledByUser对象不是Type对象并且不等于一),它实际上并没有进行类型检查。或模式进行类型检查case CancelledByUser _:case CancelledByUser():

您可以嵌套开关,使用外部匹配的提升/检查类型作为匹配值,并且可以在表达式位置使用开关表达式:

 
          case Failure fail: {
            String text;

            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text(switch (fail) {
                  case CancelledByUser() => 'Cancelled',
                  case ServerError => 'Server Error',
                  // ...
                })
Run Code Online (Sandbox Code Playgroud)