카메라 부분 추가하고 사진 firebase에 올리기
1. Firebase Storage 세팅
2. pubspec.yaml
dependencies:
flutter:
sdk: flutter
# cloud_firestore: ^0.13.5
cloud_firestore: ^4.4.1
firebase_auth: ^4.2.9
image_picker: ^0.8.6+4
firebase_storage: ^11.0.14
image_picker, firebase_storage 추가
3. auth_screen.dart
더보기
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/services.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import '../widgets/auth/auth_form.dart';
class AuthScreen extends StatefulWidget {
const AuthScreen({super.key});
@override
State<AuthScreen> createState() => _AuthScreenState();
}
class _AuthScreenState extends State<AuthScreen> {
final _auth = FirebaseAuth.instance;
var _isLoading = false;
// Auth 메소드
void _submitAuthForm(
String email,
String username,
String password,
File image,
bool isLogin,
BuildContext ctx,
) async {
UserCredential authResult;
//로그인이나 회원가입 체크하기전에는 로딩중이라는 표시
setState(() {
_isLoading = true;
});
try {
if (isLogin) {
authResult = await _auth.signInWithEmailAndPassword(
email: email, password: password);
} else {
authResult = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
final ref = FirebaseStorage.instance
.ref()
.child('user_image')
.child('${authResult.user!.uid}.jpg');
await ref.putFile(image);
final url = await ref.getDownloadURL();
// Auth뿐만 아니라 Cloud Firestore 부분에 추가 시켜주기 위한 부분
await FirebaseFirestore.instance
.collection('users')
.doc(authResult.user!.uid)
.set({
'username': username,
'email': email,
'image_url': url,
});
}
} on PlatformException catch (err) {
var message = 'An error occurred, please check your credentials';
if (err.message != null) {
message = err.message!;
}
ScaffoldMessenger.of(ctx).showSnackBar(SnackBar(
content: Text(message),
backgroundColor: Theme.of(ctx).errorColor,
));
// 로그인 회원가입등의 로딩이 끝나는 지점
setState(() {
_isLoading = false;
});
} catch (err) {
print(err);
setState(() {
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).primaryColor,
body: AuthForm(
_submitAuthForm,
_isLoading,
),
);
}
}
4. auth_form.dart
더보기
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/services.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import '../widgets/auth/auth_form.dart';
class AuthScreen extends StatefulWidget {
const AuthScreen({super.key});
@override
State<AuthScreen> createState() => _AuthScreenState();
}
class _AuthScreenState extends State<AuthScreen> {
final _auth = FirebaseAuth.instance;
var _isLoading = false;
// Auth 메소드
void _submitAuthForm(
String email,
String username,
String password,
File image,
bool isLogin,
BuildContext ctx,
) async {
UserCredential authResult;
//로그인이나 회원가입 체크하기전에는 로딩중이라는 표시
setState(() {
_isLoading = true;
});
try {
if (isLogin) {
authResult = await _auth.signInWithEmailAndPassword(
email: email, password: password);
} else {
authResult = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
final ref = FirebaseStorage.instance
.ref()
.child('user_image')
.child('${authResult.user!.uid}.jpg');
await ref.putFile(image);
final url = await ref.getDownloadURL();
// Auth뿐만 아니라 Cloud Firestore 부분에 추가 시켜주기 위한 부분
await FirebaseFirestore.instance
.collection('users')
.doc(authResult.user!.uid)
.set({
'username': username,
'email': email,
'image_url': url,
});
}
} on PlatformException catch (err) {
var message = 'An error occurred, please check your credentials';
if (err.message != null) {
message = err.message!;
}
ScaffoldMessenger.of(ctx).showSnackBar(SnackBar(
content: Text(message),
backgroundColor: Theme.of(ctx).errorColor,
));
// 로그인 회원가입등의 로딩이 끝나는 지점
setState(() {
_isLoading = false;
});
} catch (err) {
print(err);
setState(() {
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).primaryColor,
body: AuthForm(
_submitAuthForm,
_isLoading,
),
);
}
}
5.user_image_picker
더보기
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
class UserImagePicker extends StatefulWidget {
UserImagePicker(this.imagePickFn);
final Function(File pickedImage) imagePickFn;
@override
State<UserImagePicker> createState() => _UserImagePickerState();
}
class _UserImagePickerState extends State<UserImagePicker> {
File? _pickedImage;
void _pickImage() async {
final imagePicker = ImagePicker();
final pickedImageFile = await imagePicker.getImage(
source: ImageSource.camera,
imageQuality: 50,
maxWidth: 150,
);
setState(() {
if (pickedImageFile != null) {
_pickedImage = File(pickedImageFile.path);
}
});
widget.imagePickFn(File(pickedImageFile!.path));
}
@override
Widget build(BuildContext context) {
return Column(
children: [
CircleAvatar(
backgroundImage:
_pickedImage != null ? FileImage(_pickedImage!) : null,
radius: 40,
),
TextButton.icon(
style: TextButton.styleFrom(
foregroundColor: Theme.of(context).primaryColor,
),
onPressed: _pickImage,
icon: Icon(Icons.image),
label: Text('Add Image'),
),
],
);
}
}
결과 :
'Flutter 학습 > 채팅 앱 만들기' 카테고리의 다른 글
채팅앱 만들기 4 (0) | 2023.02.25 |
---|---|
채팅앱 만들기 3 (Auth) (0) | 2023.02.22 |
채팅앱 만들기2 (앱과 Firebase 연결) (0) | 2023.02.21 |
채팅앱 만들기1 (Firebase 설정) (0) | 2023.02.21 |