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
- setstate
- signout
- changenotifierprovider
- Camera
- datetime
- Navigator
- reference
- provider
- Stream
- divider
- globalkey
- Swift
- changenotifier
- snackbar
- switch
- enum
- platformexception
- borderRadius
- swift 문법
- 문법
- user
- controller
- consumer
- ListView.builder
- runTransaction
- transform
- permission
- Snapshot
- Firebase
- multiprovider
Archives
- Today
- Total
코딩하는 제리
[Flutter/Project](Instagram Clone) user follow/unfollow 본문
Flutter/Project_InstaClone(완)
[Flutter/Project](Instagram Clone) user follow/unfollow
JerryCho 2021. 3. 2. 17:30소스코드 및 pubspec.yaml
// screens/search_screen.dart
import 'package:flutter/material.dart';
import 'package:flutter_project_IJ/models/firestore/user_model.dart';
import 'package:flutter_project_IJ/models/user_model_state.dart';
import 'package:flutter_project_IJ/repo/user_network_repository.dart';
import 'package:flutter_project_IJ/widgets/my_progress_indicator.dart';
import 'package:flutter_project_IJ/widgets/rounded_avatar.dart';
import 'package:local_image_provider/local_album.dart';
import 'package:provider/provider.dart';
class SearchScreen extends StatefulWidget {
@override
_SearchScreenState createState() => _SearchScreenState();
}
class _SearchScreenState extends State<SearchScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('Follow/UnFollow'),
),
body: StreamBuilder<List<UserModel>>(
stream: userNetworkRepository.getAllUsersWithoutMe(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return SafeArea(
child: Consumer<UserModelState>(
builder: (BuildContext context, UserModelState myUserModelState,
Widget child) {
return ListView.separated(
// 데이터 갯수
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
UserModel otherUser = snapshot.data[index];
// follow/unfollow 확인.
bool amIFollowing = myUserModelState
.amIFollowingThisUser(otherUser.userKey);
return ListTile(
onTap: () {
setState(() {
amIFollowing
? userNetworkRepository.unFollowUser(
myUserKey:
myUserModelState.userModel.userKey,
otherUserKey: otherUser.userKey)
: userNetworkRepository.followUser(
myUserKey:
myUserModelState.userModel.userKey,
otherUserKey: otherUser.userKey);
});
},
leading: RoundedAvatar(),
title: Text(otherUser.username),
subtitle:
Text('this is user bio of ${otherUser.username}'),
trailing: Container(
height: 30,
width: 80,
// Container 중앙정렬
alignment: Alignment.center,
decoration: BoxDecoration(
// 배경색
color:
amIFollowing ? Colors.red[50] : Colors.blue[50],
// 테두리 모양
border: Border.all(
color: amIFollowing ? Colors.red : Colors.blue,
width: 0.5),
// 모서리 둥글기
borderRadius: BorderRadius.circular(8),
),
child: Text(
amIFollowing ? 'unfollow' : 'follow',
style: TextStyle(fontWeight: FontWeight.bold),
),
),
);
},
separatorBuilder: (context, builder) {
return Divider(
// 구분선
color: Colors.grey,
);
},
);
},
),
);
} else {
return MyProgressIndicator();
}
},
),
);
}
}
// repo/user_model_state.dart
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter_project_IJ/models/firestore/user_model.dart';
// 유저마다 다른 데이터를 위젯에 새로 출력하기 위해 작성.
class UserModelState extends ChangeNotifier {
UserModel _userModel;
// 구독 정보를 저장하고 있다가 사용자가 로그아웃하면
// 더 이상 데이터를 전달 받지 않도록 구독을 취소함.
StreamSubscription<UserModel> _currentStreamSub;
UserModel get userModel => _userModel;
// userModel 데이터가 바뀔 때 해당 위젯에 알려줌.
set userModel(UserModel userModel) {
_userModel = userModel;
notifyListeners();
}
// currentStreamSub을 받아와서 _currentStreamSub에 저장.
set currentStreamSub(StreamSubscription<UserModel> currentStreamSub) =>
_currentStreamSub = currentStreamSub;
clear() {
// null이 아니면 실행.
if(_currentStreamSub != null)
_currentStreamSub.cancel();
_currentStreamSub = null;
_userModel = null;
}
bool amIFollowingThisUser(String otherUserKey) {
// 다른 유저의 키를 가지고 있으면 follow, 아니면 unfollow
return _userModel.followings.contains(otherUserKey);
}
}
'Flutter > Project_InstaClone(완)' 카테고리의 다른 글
[Flutter/Project](Instagram Clone) comment model 및 생성/업데이트 파일 (0) | 2021.03.08 |
---|---|
[Flutter/Project](Instagram Clone) follow한 유저의 포스트를 피드에 출력하기 (0) | 2021.03.04 |
[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.02 |
Comments