Внутренний метод в указанном c состоянии не распознается, шаблон Blo C - PullRequest
0 голосов
/ 07 марта 2020

Я строю проект флаттера, используя Blo c Управление состоянием. Но есть кое-что, чего я не понимаю. Я знаю, как сделать 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 с методом Blo c реализации, подобным 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 показывает красную линию, а также метод copyWith() не распознает. Сообщение об ошибке выглядит следующим образом: error pic то, что IDE сообщает, это

метод copyWith () не определен для класса 'MainHomeState'

Может ли кто-нибудь помочь мне дать простое объяснение этого случая? Спасибо, я использовал Flutter в этой версии 1.12.13 и Dart версии 2.7.0

1 Ответ

0 голосов
/ 08 марта 2020

Наконец-то я понял, в чем моя главная проблема. Возможно, это немного отличается, когда мы используем состояние в BlocBuilder (на экранах), которое автоматически определяет указанное c состояние. Итак, что я должен сделать, это просто бросить его на ребенка, которого я хотел. Таким образом, решение этого дела таково:

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);

        }
      }

Я надеюсь, что это поможет кому-то в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...