? 分页Cubit ?
? 入门
- 一个使用
flutter_bloc库实现分页的 Flutter 应用程序。该项目演示了如何高效地分块加载和显示数据,提供流畅的用户体验,同时最大限度地减少资源消耗。
? 特点
-
使用 Cubit 进行分页:在分页场景中利用 flutter_bloc 的强大功能进行高效的状态管理。
-
高效数据加载:分块加载数据以最大限度地减少对性能的影响。
-
加载状态:处理加载状态,让用户在数据获取期间了解情况。
-
错误处理:优雅地处理数据检索过程中的错误。
⚙️ 定制
- 根据您的要求定制剪贴板的外观和行为
1- PaginationCubit:
class PostsCubit extends Cubit<PostsState> {
final PostsRepo postsRepo;
PostsCubit(this.postsRepo) : super(PostsInitial());
// MARK: - Variables.
int page = 1;
List<Post> posts = [];
// MARK: - Load With Pagination Method.
Future<void> loadPosts() async {
// MARK: - Variables.
final currentState = state;
bool isRefresh = false;
var oldPosts = <Post>[];
// MARK: - States.
if (state is PostsLoading) return;
if (currentState is PostsLoaded) {
oldPosts = currentState.posts;
} else if (currentState is PostsLoading) {
oldPosts = currentState.oldPosts;
isRefresh = currentState.isRefresh;
}
emit(PostsLoading(oldPosts: oldPosts, isRefresh: page == 1 ? false : isRefresh));
postsRepo.fetchPosts(page).then((newPosts) {
page++;
posts.addAll(newPosts);
emit(PostsLoaded(posts: posts));
}).catchError((e) {
// ignore: deprecated_member_use
if (e is DioError) {
debugPrint(e.response?.data);
}
});
}
}
2- PaginationState:
@immutable
sealed class PostsState {}
final class PostsInitial extends PostsState {}
final class PostsLoading extends PostsState {
final List<Post> oldPosts;
final bool isRefresh;
PostsLoading({required this.oldPosts, this.isRefresh = false});
}
final class PostsLoaded extends PostsState {
final List<Post> posts;
PostsLoaded({required this.posts});
}
? UI
a.mp4
? 依赖项
flutter_bloc: ^8.1.3
? 贡献指南
- 欢迎贡献 ?
- 如果您发现任何问题或有改进建议,请随时打开一个 issue 或提交一个 pull request。
? 许可证
- 此包根据 MIT 许可证分发。您可以根据您的项目需求随意使用和修改它。
? 与我联系
? 支持
- 如果您觉得本教程有用或从本代码中学到了什么,请通过 star 这个 repo 来表达您的 ❤️。