Devhq provide a lot of services
Hello guys this is a very important topic for the us in this post i will share you how to get all chat in our chat room
Caches Network Image in flutter and Get All Chat room in Chat App

Video
For Caches Network Image
Add this Code in 📁Androidmanifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
also this line
android:enableOnBackInvokedCallback="true">
Full AndroidManifist.xml Code
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:label="sampark"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:enableOnBackInvokedCallback="true">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
Get Chat room Function
Future<void> getChatRoomList() async {
List<ChatRoomModel> tempChatRoom = [];
await db.collection('chats').get().then(
(value) {
tempChatRoom = value.docs
.map(
(e) => ChatRoomModel.fromJson(e.data()),
)
.toList();
},
);
chatRoomList.value = tempChatRoom
.where(
(e) => e.id!.contains(
auth.currentUser!.uid,
),
)
.toList();
print(chatRoomList);
}
Next Video Get All Chat room
Video
https://www.youtube.com/watch?v=xRrgSmcbu6g
🗃️ChatController.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:sampark/Controller/ProfileController.dart';
import 'package:sampark/Model/ChatRoomModel.dart';
import 'package:sampark/Model/UserMode.dart';
import 'package:uuid/uuid.dart';
import '../Model/ChatModel.dart';
class ChatController extends GetxController {
final auth = FirebaseAuth.instance;
final db = FirebaseFirestore.instance;
RxBool isLoading = false.obs;
var uuid = Uuid();
ProfileController controller = Get.put(ProfileController());
String getRoomId(String targetUserId) {
String currentUserId = auth.currentUser!.uid;
if (currentUserId[0].codeUnitAt(0) > targetUserId[0].codeUnitAt(0)) {
return currentUserId + targetUserId;
} else {
return targetUserId + currentUserId;
}
}
UserModel getSender(UserModel currentUser, UserModel targetUser) {
String currentUserId = currentUser.id!;
String targetUserId = targetUser.id!;
if (currentUserId[0].codeUnitAt(0) > targetUserId[0].codeUnitAt(0)) {
return currentUser;
} else {
return targetUser;
}
}
UserModel getReciver(UserModel currentUser, UserModel targetUser) {
String currentUserId = currentUser.id!;
String targetUserId = targetUser.id!;
if (currentUserId[0].codeUnitAt(0) > targetUserId[0].codeUnitAt(0)) {
return targetUser;
} else {
return currentUser;
}
}
Future<void> sendMessage(
String targetUserId, String message, UserModel targetUser) async {
isLoading.value = true;
String chatId = uuid.v6();
String roomId = getRoomId(targetUserId);
DateTime timestamp = DateTime.now();
String nowTime = DateFormat('hh:mm a').format(timestamp);
UserModel sender = getSender(controller.currentUser.value, targetUser);
UserModel receiver = getReciver(controller.currentUser.value, targetUser);
var newChat = ChatModel(
id: chatId,
message: message,
senderId: auth.currentUser!.uid,
receiverId: targetUserId,
senderName: controller.currentUser.value.name,
timestamp: DateTime.now().toString(),
);
var roomDetails = ChatRoomModel(
id: roomId,
lastMessage: message,
lastMessageTimestamp: nowTime,
sender: sender,
receiver: receiver,
timestamp: DateTime.now().toString(),
unReadMessNo: 0,
);
try {
await db
.collection("chats")
.doc(roomId)
.collection("messages")
.doc(chatId)
.set(
newChat.toJson(),
);
await db.collection("chats").doc(roomId).set(
roomDetails.toJson(),
);
} catch (e) {
print(e);
}
isLoading.value = false;
}
Stream<List<ChatModel>> getMessages(String targetUserId) {
String roomId = getRoomId(targetUserId);
return db
.collection("chats")
.doc(roomId)
.collection("messages")
.orderBy("timestamp", descending: true)
.snapshots()
.map(
(snapshot) => snapshot.docs
.map(
(doc) => ChatModel.fromJson(doc.data()),
)
.toList(),
);
}
}
🗃️ContactController.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:get/get.dart';
import 'package:sampark/Model/ChatRoomModel.dart';
import 'package:sampark/Model/UserMode.dart';
class ContactController extends GetxController {
final db = FirebaseFirestore.instance;
final auth = FirebaseAuth.instance;
RxBool isLoading = false.obs;
RxList<UserModel> userList = <UserModel>[].obs;
RxList<ChatRoomModel> chatRoomList = <ChatRoomModel>[].obs;
void onInit() async {
super.onInit();
await getUserList();
await getChatRoomList();
}
Future<void> getUserList() async {
isLoading.value = true;
try {
userList.clear();
await db.collection("users").get().then(
(value) => {
userList.value = value.docs
.map(
(e) => UserModel.fromJson(e.data()),
)
.toList(),
},
);
} catch (ex) {
print(ex);
}
isLoading.value = false;
}
Future<void> getChatRoomList() async {
List<ChatRoomModel> tempChatRoom = [];
await db
.collection('chats')
.orderBy("timestamp", descending: true)
.get()
.then(
(value) {
tempChatRoom = value.docs
.map(
(e) => ChatRoomModel.fromJson(e.data()),
)
.toList();
},
);
chatRoomList.value = tempChatRoom
.where(
(e) => e.id!.contains(
auth.currentUser!.uid,
),
)
.toList();
print(chatRoomList);
}
}
🗃️ChatList.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sampark/Config/Images.dart';
import 'package:sampark/Controller/ContactController.dart';
import 'package:sampark/Controller/ProfileController.dart';
import 'package:sampark/Pages/Chat/ChatPage.dart';
import 'package:sampark/Pages/Home/Widget/ChatTile.dart';
class ChatList extends StatelessWidget {
const ChatList({super.key});
@override
Widget build(BuildContext context) {
ContactController contactController = Get.put(ContactController());
ProfileController profileController = Get.put(ProfileController());
return RefreshIndicator(
child: Obx(
() => ListView(
children: contactController.chatRoomList
.map(
(e) => InkWell(
onTap: () {
Get.to(
ChatPage(
userModel: (e.receiver!.id ==
profileController.currentUser.value.id
? e.sender
: e.receiver)!,
),
);
},
child: ChatTile(
imageUrl: (e.receiver!.id ==
profileController.currentUser.value.id
? e.sender!.profileImage
: e.receiver!.profileImage) ??
AssetsImage.defaultProfileUrl,
name: (e.receiver!.id ==
profileController.currentUser.value.id
? e.sender!.name
: e.receiver!.name)!,
lastChat: e.lastMessage ?? "Last Message",
lastTime: e.lastMessageTimestamp ?? "Last Time",
),
),
)
.toList(),
),
),
onRefresh: () {
return contactController.getChatRoomList();
},
);
}
}
Thanks for reading❤️