Contents
적용 ⇒ 로그인 할 때// 1번 방법
(String, int) hello(){
return ("ssar", 1234);
}
void main() {
var (username, password) = hello();
print(username);
print(password);
}
// 2번 방법
({String username, int password}) hello(){
return (username:"ssar", password:1234);
}
void main() {
var n = hello();
print(n.username);
print(n.password);
}
두 개를 리턴 할 수 있다.
적용 ⇒ 로그인 할 때
response도 넘겨야 하고, 헤더에 토큰도 넘겨야 한다.
예시 로그인 코드들
Future<void> login(String username, String password) async {
// 파싱
final body = {
"username": username,
"password": password,
};
// 통신
final (responseBody, accessToken) =
await userRepo.findByUsernameAndPassword(body);
if (!responseBody["success"]) {
ScaffoldMessenger.of(mContext!).showSnackBar(
SnackBar(content: Text("로그인 실패 : ${responseBody["errorMessage"]}")),
);
return;
}
// 1. 토큰을 Storage 저장
await secureStorage.write(
key: "accessToken",
value: accessToken); // I/O << 비동기가 디폴트라서 동기로 묶어줘야 한다.
// 2. SessionUser 갱신
Map<String, dynamic> data = responseBody["response"];
state = SessionUser(
id: data["id"],
username: data["username"],
accessToken: accessToken,
isLogin: true);
// 3. Dio 토큰 세팅 , Dio << 메모리에 저장
dio.options.headers = {"Authorization": accessToken};
//Logger().d(dio.options.headers);
Navigator.popAndPushNamed(mContext, "/post/list");
}
repo
//async* >> stream 데이터 받을 때, 계속 받아준다. || 받을 때는 >> yield;
Future<(Map<String, dynamic>, String)> findByUsernameAndPassword(
Map<String, String> data) async {
Response response = await dio.post("/login", data: data);
Map<String, dynamic> body = response.data;
//Logger().d(body); // test 코드 작성 - 직접해보기
// 토큰꺼내기
String accessToken = "";
try {
accessToken = response.headers["Authorization"]![0] ?? "";
//Logger().d(accessToken);
} catch (e) {}
return (body, accessToken);
}
return 에서 body와 accessToken 두개를 돌려주는 것을 알 수 있다.
Share article