? 分页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。

? 许可证

License: MIT Version

  • 此包根据 MIT 许可证分发。您可以根据您的项目需求随意使用和修改它。

? 与我联系

LinkedIn Gmail Facebook Instagram

? 支持

  • 如果您觉得本教程有用或从本代码中学到了什么,请通过 star 这个 repo 来表达您的 ❤️。

GitHub

查看 Github