【问题标题】:Inner method in specific state is not recognized, BloC pattern无法识别特定状态下的内部方法,BloC 模式
【发布时间】:2020-06-19 22:31:24
【问题描述】:

我使用 Bloc State 管理构建了一个颤振项目。但是有些东西我不明白。我知道如何将 State 作为抽象类,它为每个它的孩子实现。 我下面有班州湖,请关注班MainHomeLoaded

abstract class MainHomeState extends Equatable{

  MainHomeState();
}

class MainHomeUnInitialized extends MainHomeState{

  @override
  List<Object> get props => null;

}

class MainHomeLoading extends MainHomeState{

  @override
  List<Object> get props => null;

}

class MainHomeLoaded extends MainHomeState{

  final List<Article> listArticle;
  final bool hasReachedMax;

  MainHomeLoaded({@required this.listArticle, this.hasReachedMax});

  MainHomeLoaded copyWith({
    List<Article> article,
    bool hasReacedMax,
  }){
    return MainHomeLoaded(
      listArticle: article ?? this.listArticle,
        hasReachedMax: hasReacedMax ?? this.hasReachedMax);

  }

  @override
  List<Object> get props => null;

}

class MainHomeError extends MainHomeState{

  final String errorMsg;

  MainHomeError({@required this.errorMsg});

  @override
  List<Object> get props => [errorMsg];

}

然后我有 MainHomeBloc 类,实现 Bloc 方法,如 mapEventtoState(),在这个方法中我做了如下条件(再次请关注条件 MainHomeLoaded):

@override
  Stream<MainHomeState> mapEventToState(MainHomeEvent event) async*{

    if(event is CallHomeLatestNews && !_hasReachedMax(state)){

      if(state is MainHomeUnInitialized){

        ResponseArticle responseArticle = await mainHomeRepository.latestNews(event.page);

        if(responseArticle.status == 'success'){
          List<Article> data = responseArticle.data;
          yield MainHomeLoaded(listArticle: data);
        }else{
          yield MainHomeError(errorMsg: responseArticle.message);
        }
      }

      if(state is MainHomeLoaded){

        ResponseArticle responseArticle = await mainHomeRepository.latestNews(event.page);
        if(responseArticle.status == 'success'){
          List<Article> data = responseArticle.data;


          yield data.isEmpty ? state.copyWith(hasReacedMax: true)
              : MainHomeLoaded(listArticle: state.listArticle + data, hasReachedMax: false);

        }
      }
    }

这是我完全不理解的部分,如您所见,我们认为状态处于 MainHomeLoaded 中,因为在 if 内部是有条件的,但我得到错误构建并且我的 IDE 显示红线以及方法 @987654330 @不认识。错误显示如下: IDE 说的是

方法 copyWith() 没有为类 'MainHomeState' 定义

有人可以帮我对这个案例做简单的解释吗?谢谢 仅供参考,我在这个版本 1.12.13 和 Dart 版本 2.7.0 中使用了 Flutter

【问题讨论】:

    标签: flutter dart methods bloc


    【解决方案1】:

    最后我发现了我的主要问题。当我们在 BlocBuilder 中(在 Screens 中)使用自动知道特定状态的状态时,可能会有点不同。所以我要做的就是把它变成我想要的孩子。所以这个案例的解决方案是这样的:

    if(state is MainHomeLoaded){
    
            MainHomeLoaded mainHomeLoaded = state as MainHomeLoaded; // what i need
    
            ResponseArticle responseArticle = await mainHomeRepository.latestNews(defaultPage);
            if(responseArticle.status == 'success'){
    
              List<Article> newData = responseArticle.data;
    
    
              if(newData.isEmpty){
    
                mainHomeLoaded.copyWith(hasReacedMax: true);
                yield mainHomeLoaded;
              }
              defaultPage++;
            }else{
              print('gagal');
    
              yield MainHomeError(errorMsg: responseArticle.message);
    
            }
          }
    

    我希望它会在将来对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2020-09-01
      • 2019-01-19
      • 2020-12-20
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      相关资源
      最近更新 更多