Я строю проект флаттера, используя 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()
не распознает. Сообщение об ошибке выглядит следующим образом: то, что IDE сообщает, это
метод copyWith () не определен для класса 'MainHomeState'
Может ли кто-нибудь помочь мне дать простое объяснение этого случая? Спасибо, я использовал Flutter в этой версии 1.12.13 и Dart версии 2.7.0