Skip to content

Commit

Permalink
remove post cubit and flutter bloc from bond
Browse files Browse the repository at this point in the history
  • Loading branch information
salahamassi committed Mar 30, 2024
1 parent dd6d5a8 commit 87225d7
Show file tree
Hide file tree
Showing 8 changed files with 82 additions and 102 deletions.
12 changes: 1 addition & 11 deletions lib/features/main/routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@ library main_routes;

import 'package:bond/features/main/presentation/main_page.dart';
import 'package:bond/features/more/presentation/more_page.dart';
import 'package:bond_core/bond_core.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';

import '../post/presentations/cubit/post_cubit.dart';
import '../post/presentations/posts_page.dart';

final mainRoutes = [
Expand All @@ -19,14 +16,7 @@ final mainRoutes = [
routes: [
GoRoute(
path: '/home',
builder: (context, state) => MultiBlocProvider(
providers: [
BlocProvider<PostCubit>(
create: (context) => sl<PostCubit>()..loadAllPosts(),
),
],
child: const PostsPage(),
),
builder: (context, state) => const PostsPage(),
),
],
),
Expand Down
2 changes: 0 additions & 2 deletions lib/features/post/post_service_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ import 'package:get_it/get_it.dart';

import 'data/api.dart';
import 'data/models/post.dart';
import 'presentations/cubit/post_cubit.dart';

class PostServiceProvider extends ServiceProvider with ResponseDecoding {
@override
Future<void> register(GetIt it) async {
it.registerFactory(() => PostsApi(it()));
it.registerFactory(() => PostCubit(it()));
}

@override
Expand Down
41 changes: 0 additions & 41 deletions lib/features/post/presentations/cubit/post_cubit.dart

This file was deleted.

27 changes: 14 additions & 13 deletions lib/features/post/presentations/posts_page.dart
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import 'package:bond/features/post/presentations/providers/posts_provider.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'cubit/post_cubit.dart';
import 'views/home_app_bar.dart';
import 'views/post_item.dart';

class PostsPage extends StatelessWidget {
class PostsPage extends ConsumerWidget {
const PostsPage({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
final postCubit = context.watch<PostCubit>();
Widget build(BuildContext context, WidgetRef ref) {
final postsState = ref.watch(postsProvider);
final postsController = ref.read(postsProvider.notifier);
return Scaffold(
appBar: const HomeAppBar(),
body: postCubit.state.when(
initial: () => const Center(child: CircularProgressIndicator()),
success: (posts, loading) => SingleChildScrollView(
controller: postCubit.scrollController,
body: postsState.when(
loading: () => const Center(child: CircularProgressIndicator()),
data: (posts) => SingleChildScrollView(
controller: postsController.scrollController,
child: Column(
children: [
GridView.count(
Expand All @@ -27,16 +28,16 @@ class PostsPage extends StatelessWidget {
childAspectRatio: 0.6,
mainAxisSpacing: 6.0,
crossAxisSpacing: 6.0,
children: posts.map((post) {
children: posts.data.data.map((post) {
return PostItem(post: post);
}).toList(),
),
if (loading) const CircularProgressIndicator.adaptive(),
if (posts.isLoading) const CircularProgressIndicator.adaptive(),
],
),
),
failed: (error) => Center(
child: Text(error),
error: (error, _) => Center(
child: Text(error.toString()),
),
),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
part of 'post_cubit.dart';
// extract to bond network package
import 'package:bond_network/bond_network.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/widgets.dart';

enum ListStatus { initial, loading, success, failed }

Expand All @@ -11,12 +14,20 @@ class ListState<T extends Model> extends Equatable {

final String? error;

bool get isLoading => status == ListStatus.loading;

factory ListState.initial() => ListState<T>(
ListResponse<T>(data: List<T>.empty(growable: true)),
ListStatus.initial,
null,
);

factory ListState.data(ListResponse<T> data) => ListState<T>(
data,
ListStatus.success,
null,
);

ListState<T> loading() => copyWith(status: ListStatus.loading);

ListState<T> success(ListResponse<T> newData) => copyWith(
Expand Down
55 changes: 55 additions & 0 deletions lib/features/post/presentations/providers/posts_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import 'package:bond/features/post/data/api.dart';
import 'package:bond/features/post/data/models/post.dart';
import 'package:bond_core/bond_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'list_state.dart';

final postsProvider =
AsyncNotifierProvider.autoDispose<PostController, ListState<Post>>(
() {
final scrollController = ScrollController();

return PostController(sl(), scrollController);
},
);

class PostController extends AutoDisposeAsyncNotifier<ListState<Post>> {
PostController(this._api, this.scrollController) : super() {
scrollController.addListener(_scrollControllerListener);
ref.onDispose(
() {
scrollController.dispose();
scrollController.removeListener(_scrollControllerListener);
},
);
}

final PostsApi _api;
final ScrollController scrollController;

@override
Future<ListState<Post>> build() async {
final response = await _api.posts();
return ListState.data(response);
}

void loadMore() async {
state = AsyncData(state.requireValue.loading());
state = await AsyncValue.guard(() async {
final response = await _api.posts();
return state.requireValue.success(response);
});
}

void _scrollControllerListener() {
final maxScroll = scrollController.position.maxScrollExtent;
final currentScroll = scrollController.position.pixels;
const delta = 200.0;
if (maxScroll - currentScroll <= delta &&
state.value?.status != ListStatus.loading) {
loadMore();
}
}
}
32 changes: 0 additions & 32 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.11.0"
bloc:
dependency: "direct main"
description:
name: bloc
sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"
url: "https://pub.dev"
source: hosted
version: "8.1.4"
bond_app_analytics:
dependency: "direct main"
description:
Expand Down Expand Up @@ -478,14 +470,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_bloc:
dependency: "direct main"
description:
name: flutter_bloc
sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2
url: "https://pub.dev"
source: hosted
version: "8.1.5"
flutter_launcher_icons:
dependency: "direct dev"
description:
Expand Down Expand Up @@ -829,14 +813,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.4"
nested:
dependency: transitive
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
open_store:
dependency: "direct main"
description:
Expand Down Expand Up @@ -997,14 +973,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.2.4"
provider:
dependency: transitive
description:
name: provider
sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
url: "https://pub.dev"
source: hosted
version: "6.1.2"
pub_semver:
dependency: transitive
description:
Expand Down
2 changes: 0 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ dependencies:
google_fonts: ^5.0.0

# state management
bloc: ^8.0.2
flutter_bloc: ^8.0.1
flutter_riverpod: ^2.5.1
equatable: ^2.0.5

Expand Down

0 comments on commit 87225d7

Please sign in to comment.