我通过使用Bloc State管理来构建一个Flutter项目。但是有些事情我不理解。我知道如何使State作为Abstract类,对每个子类都实现该类。
我下面有州立湖,请重点关注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显示红线和方法copyWith()
无法识别。错误显示如下:
IDE所说的是
未为类'MainHomeState'定义方法copyWith()
有人可以帮我简单说明一下吗?谢谢 仅供参考,我在1.12.13版和Dart 2.7.0版中使用了Flutter
答案 0 :(得分:0)
最后,我发现了我的主要问题。当我们在BlocBuilder中使用状态(在屏幕中)自动知道特定状态时,也许有些不同。因此,我要做的只是将其投射为我想要的孩子。因此,这种情况的解决方案是这样的:
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);
}
}
我希望它将对以后的人有所帮助。