【发布时间】:2020-02-28 22:39:37
【问题描述】:
所以我有一个可点击的简单列表并转到 DetailScreen,我遇到的问题是当我从 DetailScreen 中单击返回时,如何管理此状态以保存最后一个列表?
集团
if (event is GetNews && !_hasReachedMax(state)) {
try {
if (currentState is NewsInitial) {
final news = await fetchNews(event.cat, pageNumber);
yield NewsLoaded(news, false);
}
if (currentState is NewsLoaded) {
pageNumber++;
final news = await fetchNews(event.cat, pageNumber);
yield news.isEmpty
? currentState.copyWith(hasReachedMax: true)
: NewsLoaded(currentState.node + news, false);
}
} catch (error) {
print(error);
yield NewsError("Error fetching news" + error);
}
} else if (event is GetDetailedNews) {
try {
final filter = await fetchDetailedNews(event.id);
yield DetailedNewsLoaded(filter);
} catch (error) {
yield NewsError("Couldn't fetch news : $error");
}
}
将事件附加到集团
@override
void initState() {
super.initState();
_postBloc = BlocProvider.of<NewsBloc>(context)
..add(GetNews(widget.cat));
}
块生成器
OnBackPressed 我只是坚持else,因为我不知道如何管理状态
return BlocBuilder<NewsBloc, NewsState>(builder: (context, state) {
if (state is NewsLoaded) {
return ListView.builder(
controller: _scrollController,
itemCount: state.hasReachedMax
? state.node.length
: state.node.length + 1,
itemBuilder: (context, index) {
fullList = state.node;
print("list: ${state.node} \nlength: ${state.node
.length} \nindex: $index \n--------------");
return index >= state.node.length ?
BottomLoader() :
listViews(context, state.node[index], index);
});
}
else if (state is NewsError) {
return Center(
child: Container(
child: Text(state.message),
));
}
else {
return Center(child: CircularProgressIndicator(),);
}
});
国家
abstract class NewsState extends Equatable {
const NewsState();
@override
List<Object> get props => [];
}
class NewsInitial extends NewsState {
const NewsInitial();
@override
List<Object> get props => [];
}
class NewsLoading extends NewsState {
const NewsLoading();
@override
List<Object> get props => [];
}
class NewsLoaded extends NewsState {
final List<Node> node;
final bool hasReachedMax;
NewsLoaded(this.node, this.hasReachedMax);
NewsLoaded copyWith({List<Node> node, bool hasReachedMax}) {
return NewsLoaded(node ?? this.node, hasReachedMax ?? this.hasReachedMax);
}
@override
List<Object> get props => [node];
}
class DetailedNewsLoaded extends NewsState {
final List<Node> node;
DetailedNewsLoaded(this.node);
@override
List<Object> get props => [node];
}
}
在详细信息屏幕中,我添加了 GetDetailScreen 事件,该事件在 onBackPressed 时保持
@override
void initState() {
BlocProvider.of<NewsBloc>(context)
..add(GetDetailedNews(widget.id));
super.initState();
}
【问题讨论】:
-
在哪里实例化 NewsBloc 对象?我在代码中看不到。确保您没有在 build 函数中执行此操作。
-
@IgorKharakhordin 我在 initState 中添加了事件,就像上面的代码一样。