플러터(Flutter) Firebase Authentication 전체 소스 코드입니다. 코드에 대한 설명을 안 보시고 오신 분은 코드 설명을 보고 오시면 코드 구현을 이해하시는데 도움이 됩니다. 또한 Firebase 초기 셋팅을 안 하신 분들은 초기 세팅을 하시고 진행하셔야 됩니다.
(중요) 코드 복사 전 firebase_core, firebase_auth, google_sign_in 플러그인 설치
👇 소스코드 설명 포스팅
👇 Firebase 연동 초기 셋팅 포스팅
소스 코드
- main.dart
import 'package:firebase_setting/login_screen.dart';
import 'package:flutter/material.dart';
import 'firebase_options.dart';
import 'package:firebase_core/firebase_core.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
runApp(const MyFirebaseApp());
}
class MyFirebaseApp extends StatelessWidget {
const MyFirebaseApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: LoginScreen(),
);
}
}
- signup_screen.dart
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_setting/login_screen.dart';
import 'package:flutter/material.dart';
class SignUpScreen extends StatefulWidget {
const SignUpScreen({super.key});
@override
State<SignUpScreen> createState() => _SignUpScreenState();
}
class _SignUpScreenState extends State<SignUpScreen> {
var _emailInputText = TextEditingController();
var _passInputText = TextEditingController();
void dispose() {
_emailInputText.dispose();
_passInputText.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: CloseButton(
onPressed: () => Navigator.pop(context),
),
),
body: Padding(
padding: EdgeInsets.all(8),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextField(
controller: _emailInputText,
decoration: InputDecoration(hintText: 'Email'),
),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextField(
controller: _passInputText,
obscureText: true,
decoration: InputDecoration(hintText: 'Password'),
),
),
Container(
padding: EdgeInsets.symmetric(vertical: 5),
width: double.infinity,
child: OutlinedButton(
onPressed: () async {
// 이메일, 비번 중 하나라도 비워있으면 패스
if (_emailInputText.text.isEmpty ||
_passInputText.text.isEmpty) return;
try {
await FirebaseAuth.instance.createUserWithEmailAndPassword(
email:
_emailInputText.text.toLowerCase().trim(), // 가입 이메일
password: _passInputText.text.trim(), // 비밀번호
);
print('success registered');
Navigator.push(
context,
MaterialPageRoute(builder: (context) => LoginScreen()),
);
} on FirebaseAuthException catch (e) {
print('an error occured $e');
}
},
child: Text('이메일 회원가입'),
),
),
],
),
),
);
}
}
- login_screen.dart
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_setting/home_screen.dart';
import 'package:firebase_setting/signup_screen.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
@override
State<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
var _emailInputText = TextEditingController();
var _passInputText = TextEditingController();
void dispose() {
_emailInputText.dispose();
_passInputText.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextField(
controller: _emailInputText,
decoration: InputDecoration(hintText: 'Email'),
),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextField(
controller: _passInputText,
obscureText: true,
decoration: InputDecoration(hintText: 'Password'),
),
),
Container(
padding: EdgeInsets.symmetric(vertical: 5),
width: double.infinity,
child: OutlinedButton(
onPressed: () async {
// 이메일, 비번 중 하나라도 비워있으면 패스
if (_emailInputText.text.isEmpty ||
_passInputText.text.isEmpty) return;
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: _emailInputText.text.toLowerCase().trim(),
password: _passInputText.text.trim(),
);
print('success login');
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomeScreen()),
);
} on FirebaseAuthException catch (e) {
print('an error occured $e');
}
},
child: Text('이메일 로그인'),
),
),
Container(
padding: EdgeInsets.symmetric(vertical: 5),
width: double.infinity,
child:
ElevatedButton(
onPressed: () async {
final _googleSignIn = GoogleSignIn();
final googleAccount = await _googleSignIn.signIn();
if (googleAccount != null) {
final googleAuth = await googleAccount.authentication;
if (googleAuth.accessToken != null &&
googleAuth.idToken != null) {
try {
await FirebaseAuth.instance
.signInWithCredential(GoogleAuthProvider.credential(
idToken: googleAuth.idToken,
accessToken: googleAuth.accessToken,
));
print('success registered');
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomeScreen()),
);
} on FirebaseAuthException catch (e) {
print('an error occured $e');
} catch (e) {
print('an error occured $e');
}
} else
print('an error occured');
} else
print('an error occured');
},
child: Text('구글로 시작하기'),
),
),
Align(
alignment: Alignment.centerRight,
child: TextButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SignUpScreen()),
);
},
// width: double.infinity,
child: Text('회원가입 하러가기'),
),
),
],
),
),
);
}
}
- home_screen.dart
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: Text('Home Screen')),
);
}
}
'너도 할수 있어! 프로그래밍 > 프로그래밍 전체 코드 모아보기' 카테고리의 다른 글
[Flutter] 플러터 Firebase 연동을 위한 초기 셋팅 방법 - 소스 코드 (0) | 2022.12.23 |
---|---|
[Flutter] 플러터 BottomNavigationBar, BottomNavigationBarItime 전체 소드코드 (0) | 2022.12.19 |
[Flutter] 플러터 TextFormField 위젯 - 소스코드 (0) | 2022.12.17 |
[Flutter] 플러터 버튼 위젯 - 소스코드 (0) | 2022.12.16 |