无法识别特定状态的内部方法,BloC 模式
Inner method in specific state is not recognized, BloC pattern
我使用 Bloc State 管理构建了一个 flutter 项目。但是有些事情我不明白。我知道如何将 State 设为 Abstract class ,它会为每个子项实现。
下面我有class州湖,请关注classMainHomeLoaded
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
class 和像 mapEventtoState()
这样的实现 Bloc 方法,在这个方法中我做了如下条件(再次请关注条件 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 说的是
method copyWith() is not define for the class 'MainHomeState'
谁能帮我简单解释一下这个案例?谢谢
仅供参考,我在此版本 1.12.13 和 Dart 版本 2.7.0
中使用了 Flutter
我终于找到了我的主要问题。当我们在自动知道特定状态的 BlocBuilder(在屏幕中)中使用状态时,可能会有点不同。所以我要做的就是将它转换为我想要的 child 。所以本例的解法是这样的:
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);
}
}
希望对以后的人有所帮助。
我使用 Bloc State 管理构建了一个 flutter 项目。但是有些事情我不明白。我知道如何将 State 设为 Abstract class ,它会为每个子项实现。
下面我有class州湖,请关注classMainHomeLoaded
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
class 和像 mapEventtoState()
这样的实现 Bloc 方法,在这个方法中我做了如下条件(再次请关注条件 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()
无法识别。错误显示如下:
method copyWith() is not define for the class 'MainHomeState'
谁能帮我简单解释一下这个案例?谢谢 仅供参考,我在此版本 1.12.13 和 Dart 版本 2.7.0
中使用了 Flutter我终于找到了我的主要问题。当我们在自动知道特定状态的 BlocBuilder(在屏幕中)中使用状态时,可能会有点不同。所以我要做的就是将它转换为我想要的 child 。所以本例的解法是这样的:
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);
}
}
希望对以后的人有所帮助。