코딩하는 제리

[Flutter/Project](Instagram Clone) 본인을 제외한 모든 유저 가져오기 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) 본인을 제외한 모든 유저 가져오기

JerryCho 2021. 3. 2. 13:11

repo/user_network_repository.dart
repo/helper/transformers.dart
테스트용 코드
임의의 유저 생성
임의로 생성한 1개의 email 확인.


소스코드 및 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);
  });
}
Comments