Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- globalkey
- provider
- runTransaction
- platformexception
- Camera
- Firebase
- ListView.builder
- reference
- user
- swift 문법
- controller
- changenotifierprovider
- consumer
- datetime
- Swift
- Snapshot
- Navigator
- changenotifier
- enum
- divider
- 문법
- signout
- borderRadius
- setstate
- multiprovider
- switch
- Stream
- snackbar
- transform
- permission
Archives
- Today
- Total
코딩하는 제리
[Flutter/Project](Instagram Clone) 본인을 제외한 모든 유저 가져오기 본문
Flutter/Project_InstaClone(완)
[Flutter/Project](Instagram Clone) 본인을 제외한 모든 유저 가져오기
JerryCho 2021. 3. 2. 13:11소스코드 및 pubspec.yaml
// repo/user_network_repository.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter_project_IJ/constants/firestore_keys.dart';
import 'package:flutter_project_IJ/models/firestore/user_model.dart';
import 'package:flutter_project_IJ/repo/helper/transformers.dart';
// with -> 해당 클래스의 모든 기능을 사용.
class UserNetworkRepository with Transformers {
// 유저가 생성되어 있는지 확인
Future<void> attempCreateUser({String userKey, String email}) async {
final DocumentReference userRef =
FirebaseFirestore.instance.collection(COLLECTION_USERS).doc(userKey);
// 해당 레퍼런스의 데이터를 가져옴
DocumentSnapshot snapshot = await userRef.get();
// 해당 데이터가 존재하지 않으면 생성
if (!snapshot.exists) {
return await userRef.set(UserModel.getMapForeCreateUser(email));
}
}
Stream<UserModel> getUserModelStreams(String userKey) {
return FirebaseFirestore.instance
.collection(COLLECTION_USERS)
.doc(userKey)
.snapshots()
.transform(toUser);
// transform -> 필요한 데이터 타입으로 변경시켜줌.
/*
get() -> 유저 데이터를 Future로 한 번만 가져옴.
snapshots() -> 유저 데이터를 Stream으로 필요할 때 계속 가져옴.
*/
}
Stream<List<UserModel>> getAllUsersWithoutMe() {
// snapshots()의 QuerySnapshot을 List<UserModel>로 바꿔줘야 하기에 transform 사용.
return FirebaseFirestore.instance
.collection(COLLECTION_USERS)
.snapshots()
.transform(toUsersExceptMe);
}
}
UserNetworkRepository userNetworkRepository = UserNetworkRepository();
// repo/helper/transformers.dart
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_project_IJ/models/firestore/user_model.dart';
class Transformers {
// DocumentSnapshot을 UserModel로 바꿈.
// fromHandlers -> 생성자
final toUser = StreamTransformer<DocumentSnapshot, UserModel>.fromHandlers(
handleData: (snapshot, sink) async {
// 변환된 snapshot을 sink에 넣어서 데이터를 보냄.
sink.add(UserModel.fromSnapshot(snapshot));
});
// QuerySnapshot을 List<UserModel>로 바꿈.
// fromHandlers -> 생성자
final toUsersExceptMe =
StreamTransformer<QuerySnapshot, List<UserModel>>.fromHandlers(
handleData: (snapshot, sink) async {
// QuerySnapshot이 도착할때마다 유저 리스트를 만들어 sink로 내보냄.
// 유저들을 담을 리스트 생성
List<UserModel> users = [];
User _user = await FirebaseAuth.instance.currentUser;
snapshot.docs.forEach((documentSnapshot) {
if (_user.uid != documentSnapshot.id)
// 접속한 유저와 다른 유저만 리스트에 추가
// 해당 snapshot을 UserModel로 변경하여 List에 추가
users.add(UserModel.fromSnapshot(documentSnapshot));
});
// 변환된 snapshot을 sink에 넣어서 데이터를 보냄.
sink.add(users);
});
}
'Flutter > Project_InstaClone(완)' 카테고리의 다른 글
[Flutter/Project](Instagram Clone) user follow/unfollow (0) | 2021.03.02 |
---|---|
[Flutter/Project](Instagram Clone) search screen에 모든 유저 출력 (0) | 2021.03.02 |
[Flutter/Project](Instagram Clone) 포스트 이미지 다운로드 링크 저장 (0) | 2021.03.02 |
[Flutter/Project](Instagram Clone) 포스트 데이터 업로드/업데이트 파일 작성 (0) | 2021.03.01 |
[Flutter/Project](Instagram Clone) 포스트 생성시 작성할 데이터 파일 post model (0) | 2021.02.27 |
Comments