From d655fb166f8a4c19d1e964b5ef8ae9b67043038d Mon Sep 17 00:00:00 2001 From: mazineab Date: Wed, 6 Nov 2024 16:11:01 +0000 Subject: [PATCH] Create user list page and replace OBX by GetBuilder in comments and posts screens --- lib/common/widgets/custom_list_tile.dart | 4 +- lib/data/repositories/home_repo.dart | 10 +++ .../controller/setting_controller.dart | 3 + .../controller/status_comment_controller.dart | 1 + .../controller/users_list_controller.dart | 31 ++++++++++ .../setting/screens/comments_list.dart | 2 +- lib/featues/setting/screens/setting.dart | 1 + lib/featues/setting/screens/status_list.dart | 2 +- lib/featues/setting/screens/users_list.dart | 61 +++++++++++++++++++ lib/routes/routes.dart | 4 +- lib/routes/routes_names.dart | 1 + 11 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 lib/featues/setting/controller/users_list_controller.dart create mode 100644 lib/featues/setting/screens/users_list.dart diff --git a/lib/common/widgets/custom_list_tile.dart b/lib/common/widgets/custom_list_tile.dart index ffab269..bd2482f 100644 --- a/lib/common/widgets/custom_list_tile.dart +++ b/lib/common/widgets/custom_list_tile.dart @@ -18,7 +18,7 @@ class CustomListTile extends StatelessWidget { final String userId; String? uid; String? profileUrl; - String? statusId;//this add just when this widget used by comment + String? statusId; CustomListTile( {super.key, required this.title, @@ -59,7 +59,7 @@ class CustomListTile extends StatelessWidget { ], ), ), - menuCondition() + statusId==null && uid==null?SizedBox() :menuCondition() ], ), ), diff --git a/lib/data/repositories/home_repo.dart b/lib/data/repositories/home_repo.dart index 8018f90..6d5df35 100644 --- a/lib/data/repositories/home_repo.dart +++ b/lib/data/repositories/home_repo.dart @@ -96,4 +96,14 @@ class HomeRepo{ throw Exception(e); } } + + Future> getUsers()async{ + try{ + QuerySnapshot querySnapshot=await firebaseFireStore.collection('users').get(); + List listUsers=querySnapshot.docs.map((e)=>my_user.User.fromJson(e.data() as Map)).toList(); + return listUsers; + }catch(e){ + throw e; + } + } } \ No newline at end of file diff --git a/lib/featues/setting/controller/setting_controller.dart b/lib/featues/setting/controller/setting_controller.dart index f3d7812..6d8e52a 100644 --- a/lib/featues/setting/controller/setting_controller.dart +++ b/lib/featues/setting/controller/setting_controller.dart @@ -174,6 +174,9 @@ class SettingController extends GetxController { goCommentPage(){ Get.toNamed(RoutesNames.commentPage); } + goUsersPage(){ + Get.toNamed(RoutesNames.usersPage); + } } diff --git a/lib/featues/setting/controller/status_comment_controller.dart b/lib/featues/setting/controller/status_comment_controller.dart index 4f418ff..99e1b6f 100644 --- a/lib/featues/setting/controller/status_comment_controller.dart +++ b/lib/featues/setting/controller/status_comment_controller.dart @@ -35,6 +35,7 @@ class StatusCommentController extends GetxController{ await Future.delayed(const Duration(milliseconds: 30)); isLoad.value=false; } + update(); } @override diff --git a/lib/featues/setting/controller/users_list_controller.dart b/lib/featues/setting/controller/users_list_controller.dart new file mode 100644 index 0000000..1385ef0 --- /dev/null +++ b/lib/featues/setting/controller/users_list_controller.dart @@ -0,0 +1,31 @@ +import 'package:get/get.dart'; +import 'package:myapp/data/models/user.dart' as my_user; + +import '../../../common/dialogs/custom_snackbar.dart'; +import '../../../data/repositories/home_repo.dart'; + + +class UsersListController extends GetxController{ + List listUsers=[].obs; + var isLoad=true.obs; + HomeRepo homeRepo=Get.put(HomeRepo()); + + Future fetchUsers()async{ + try{ + List list=await homeRepo.getUsers(); + listUsers.assignAll(list); + }catch(e){ + CustomSnackbar.showErrorSnackbar(Get.context!, "Faild to load Users"); + }finally{ + await Future.delayed(const Duration(milliseconds: 30)); + isLoad.value=false; + } + update(); + } + + @override + void onInit()async { + await fetchUsers(); + super.onInit(); + } +} \ No newline at end of file diff --git a/lib/featues/setting/screens/comments_list.dart b/lib/featues/setting/screens/comments_list.dart index 9a8ac2a..98d07b9 100644 --- a/lib/featues/setting/screens/comments_list.dart +++ b/lib/featues/setting/screens/comments_list.dart @@ -27,7 +27,7 @@ class CommentsList extends StatelessWidget { backgroundColor: MyColors.appBarColor, iconTheme: IconThemeData(color: Colors.white), ), - Obx(() { + GetBuilder(builder: (_) { if (controller.isLoad.value) { return SliverFillRemaining( child: Column( diff --git a/lib/featues/setting/screens/setting.dart b/lib/featues/setting/screens/setting.dart index 49af9b2..f24216a 100644 --- a/lib/featues/setting/screens/setting.dart +++ b/lib/featues/setting/screens/setting.dart @@ -40,6 +40,7 @@ class Setting extends StatelessWidget { }), buildListTile("Notifications Preferences", Icons.notifications_outlined), buildTitle("Community Setting"), + buildListTile("Users", Icons.groups,onTap: controller.goUsersPage), buildListTile("Comment List", Icons.comment_outlined,onTap: controller.goCommentPage), buildListTile("Post List", Icons.list_outlined,onTap: controller.goStatusPage), buildTitle("Others"), diff --git a/lib/featues/setting/screens/status_list.dart b/lib/featues/setting/screens/status_list.dart index c41d9ec..15eab88 100644 --- a/lib/featues/setting/screens/status_list.dart +++ b/lib/featues/setting/screens/status_list.dart @@ -25,7 +25,7 @@ class StatusList extends StatelessWidget { backgroundColor: MyColors.appBarColor, iconTheme: IconThemeData(color: Colors.white), ), - Obx(() { + GetBuilder(builder: (_) { if (controller.isLoad.value) { return SliverFillRemaining( child: Column( diff --git a/lib/featues/setting/screens/users_list.dart b/lib/featues/setting/screens/users_list.dart new file mode 100644 index 0000000..a6ab91b --- /dev/null +++ b/lib/featues/setting/screens/users_list.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:myapp/Constants/colors.dart'; +import 'package:myapp/common/widgets/custom_list_tile.dart'; +import 'package:myapp/featues/setting/controller/users_list_controller.dart'; + +class UsersList extends StatelessWidget { + UsersList({super.key}); + + UsersListController controller=Get.put(UsersListController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: MyColors.backgroundColor, + body: CustomScrollView( + slivers: [ + SliverAppBar( + expandedHeight: 40.0, + floating: true, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + title: Text('USERS',style: TextStyle(color: Colors.white),), + ), + backgroundColor: MyColors.appBarColor, + iconTheme: IconThemeData(color: Colors.white), + ), + GetBuilder( + builder: (_){ + if(controller.isLoad.value){ + return SliverFillRemaining( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: CircularProgressIndicator( + backgroundColor: MyColors.colorbl, + ), + ), + ], + ), + ); + } + return SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final user = controller.listUsers[index]; + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: CustomListTile(title: user.getFullName(), subtitle: user.email, userId: user.id,profileUrl: user.imageUrl,), + ); + }, + childCount: controller.listUsers.length, + ), + ); + }) + ], + ), + ); + } +} diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart index ef380e5..cfa296d 100644 --- a/lib/routes/routes.dart +++ b/lib/routes/routes.dart @@ -9,6 +9,7 @@ import 'package:myapp/featues/setting/screens/comments_list.dart'; import 'package:myapp/featues/setting/screens/personal_info.dart'; import 'package:myapp/featues/setting/screens/setting.dart'; import 'package:myapp/featues/setting/screens/status_list.dart'; +import 'package:myapp/featues/setting/screens/users_list.dart'; import 'package:myapp/featues/setting/setting_binding.dart'; import 'package:myapp/routes/routes_names.dart'; @@ -25,6 +26,7 @@ class Routes{ GetPage(name: RoutesNames.personalInfo, page:()=>PersonalInfo(),binding: SettingBinding()), GetPage(name: RoutesNames.setting, page:()=>Setting(),binding: SettingBinding()), GetPage(name: RoutesNames.statusPage, page:()=>StatusList()), - GetPage(name: RoutesNames.commentPage, page:()=>CommentsList()) + GetPage(name: RoutesNames.commentPage, page:()=>CommentsList()), + GetPage(name: RoutesNames.usersPage, page:()=>UsersList()) ]; } \ No newline at end of file diff --git a/lib/routes/routes_names.dart b/lib/routes/routes_names.dart index a0d61d7..774d6ff 100644 --- a/lib/routes/routes_names.dart +++ b/lib/routes/routes_names.dart @@ -9,4 +9,5 @@ class RoutesNames { static const String setting = "/setting"; static const String statusPage="/statusPage"; static const String commentPage="/commentPage"; + static const String usersPage="/userPage"; }