<aside> ❓ 1. Getx AuthController 강의를 보고 따라서 제작하시오.
</aside>
auth_controller.dart
import 'package:dio/dio.dart';
import 'package:get/get.dart';
import '../util/api_route.dart';
import '../model/user.dart';
import '../view/login_page.dart';
import '../view/main_page.dart';
class AuthController extends GetxController {
final Rxn<User> _user = Rxn();
Dio dio = Dio();
User? get user => _user.value;
login(String id, String pw) async {
try {
var res = await dio.post(
'http://52.79.115.43:8090${ApiRoutes.authWithPassword}',
data: {'identity': id, 'password': pw}
);
if (res.statusCode == 200) {
// print(res.data());
var user = User.fromMap(res.data['record']);
_user(user);
}
} on DioError catch(e) {
print(e.message);
print(e.requestOptions.path);
}
}
logout() {
_user(null);
}
_handleAuthChanged (User? data) {
if (data != null) {
Get.toNamed(MainPage.route);
return;
}
Get.toNamed(LoginPage.route);
return;
}
@override
void onInit() {
super.onInit();
ever(_user, _handleAuthChanged);
}
}
<aside> ❓ 2. AuthController에는 User의 정보만을 담고있다. 로그인을 하면 유저를 식별할 수 있는 Token 값도 함께 받아볼 수 있는데, 해당 Token 값을 AuthController 내에 저장할 수 있도록 하고, 코드를 제시하시오.
API URL
// <http://52.79.115.43:8090/api/collections/users/auth-with-password>
API Request
// Method : POST
// data : identity(String), password(String)
// Teddy/sfac12341234
API Response
{
"token": "JWT_TOKEN",
"record": {
"id": "RECORD_ID",
"collectionId": "_pb_users_auth_",
"collectionName": "users",
"created": "2022-01-01 01:00:00Z",
"updated": "2022-01-01 23:59:59Z",
"username": "username123",
"verified": false,
"emailVisibility": true,
"email": "[email protected]",
"name": "test",
"avatar": "filename.jpg"
}
}
</aside>
auth_controller.dart
import 'package:dio/dio.dart';
import 'package:get/get.dart';
import '../util/api_route.dart';
import '../model/user.dart';
import '../view/login_page.dart';
import '../view/main_page.dart';
class AuthController extends GetxController {
final Rxn<User> _user = Rxn();
final RxString _token = RxString('');
Dio dio = Dio();
User? get user => _user.value;
String get token => _token.value;
login(String id, String pw) async {
try {
var res = await dio.post(
'http://52.79.115.43:8090${ApiRoutes.authWithPassword}',
data: {'identity': id, 'password': pw}
);
if (res.statusCode == 200) {
var responseData = res.data;
var user = User.fromMap(responseData['record']);
var token = responseData['token'] as String;
_user(user);
_token(token); // 토큰 저장
}
} on DioError catch(e) {
print(e.message);
print(e.requestOptions.path);
}
}
logout() {
_user(null);
_token(''); // 로그아웃시 토큰 초기화
}
_handleAuthChanged(User? data) {
if (data != null) {
Get.toNamed(MainPage.route);
return;
}
Get.toNamed(LoginPage.route);
return;
}
@override
void onInit() {
super.onInit();
ever(_user, _handleAuthChanged);
}
}
<aside> ❓ 3. MainController에는 readDocuments라는 멤버 함수(메서드)를 제작하시오.
해당 API의 정보는 다음과 같다 이 때, AuthController를 find하여 Token값이 존재하면 (로그인 되었다면) 실행할 수 있도록 한다.
위 API 정보를 토대로 응답 데이터형식에 맞게 Document 커스텀 클래스를 제작하고, MainPage의 Home이 다음과 같이 출력되도록 한다.
아래 FAB를 누르면 readDocuments를 실행하고 결과를 화면에 출력한다.
다음의 제공되는 코드를 사용할 수 있도록 한다.
개발팀 사원리스트(최신) 게시글의 attachment_url에는 해당 이미지의 URL이 담겨있다. ”김스팩의 비고란에 무엇이 써져있는지 비밀”을 알아내도록 한다.
(앱 디자인 방식은 자유로, 평가요소에 포함되어있지 않음) </aside>
zip
목차
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'util/app_routes.dart';
import 'view/page/login_page.dart';
import 'view/page/main_page.dart';
import 'controller/auth_controller.dart';
import 'controller/login_controller.dart';
import 'controller/main_controller.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return GetMaterialApp(
initialBinding: BindingsBuilder(() {
Get.put(AuthController());
Get.lazyPut(() => LoginController());
Get.lazyPut(() => MainController());
}),
getPages: AppPages.pages,
home: Scaffold(
body: Center(
child: TextButton(
onPressed: () => Get.toNamed(AppRoutes.login),
child: Text('로그인하기'),
),
),
),
);
}
}