【问题标题】:Dart: switch case of a class?Dart:类的开关盒?
【发布时间】:2022-12-15 00:38:42
【问题描述】:

大家好,希望你们一切顺利!

我有一个问题,是如何在课堂上使用 switch case? (这里'state'是主类,其他类继承自state。)

例如,我试图替换它:

if(state is LoadingPage)        {return LoadingPage;}
else if {state is SuccessPage)  {return SuccessPage;}
else if {state is FailPage)     {return FailPage;}

对此:

switch (state){
case LoadingPage:   {return LoadingPage;}
case SuccessPage:   {return SuccessPage;}
case FailPage:      {return FailPage;}
}

它没有用,对我有用的是将状态设为字符串,如下所示:

switch (state.toString()){
    case 'LoadingPage':      {return LoadingPage;}
    case 'SuccessPage':      {return SuccessPage;}
    case 'FailPage':         {return FailPage;}
    }

它虽然有效,但它是一个短期解决方案,就像如果我必须编辑一些东西,那么很难改变一切(因为它是一个字符串)..

【问题讨论】:

  • 嗨,我添加了一个有点类似于 switch 的解决方案。您可以使用map 处理所有情况,或使用maybeMap() 仅处理您需要的情况。

标签: flutter dart mobile switch-statement


【解决方案1】:

对于这个确切的解决方案,有一个名为freezed 的包,我们不使用switch,而是map 和/或maybeMap

@freezed
class MemberState with _$MemberState {
  factory MemberState.initial() = _MemberStateInitial;
  factory MemberState.loading() = _MemberStateLoading;
  factory MemberState.loadSuccess({required MemberDetail detail}) =
      _MemberStateLoadSuccess;
  factory MemberState.loadFailure({required AppFailure failure}) =
      _MemberStateLoadFailure;
}

用法:

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<MemberBloc, MemberState>(
      builder: (context, state) {
        return const Scaffold(
          body: state.map(
              initial: initial,
              loading: loading,
              loadSuccess: loadSuccess,
              loadFailure: loadFailure),
        );
      },
    );
  }

当然,我将它与 BLoC 一起使用,但基本概念是相同的。您可以按照自己喜欢的任何方式使用它。而且,最好的是它都是自动生成的。因此,您不必自己编写代码。

【讨论】:

    【解决方案2】:

    做这个:

    switch (state.runtimeType){
    case LoadingPage:   {return LoadingPage;}
    case SuccessPage:   {return SuccessPage;}
    case FailPage:      {return FailPage;}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2017-02-08
      • 2015-10-27
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多