📁
ゲストログインからリンク(登録)する機能の実装
はじめに
ゲストでログイン機能を実装したのでついでにゲストログインからリンク(登録)できるようにしました。
実装したいこと
-
➀ゲストログインでログイン
- ユーザデータ(createdAt,uid,userName,email)の追加
- ゲストでログイン
- 画面遷移
-
➁リンクさせる
- リンク
- ユーザデータ変更
- 画面遷移
【参考公式URL】
・※Authenticate with Firebase Anonymously
行ったこと
➀の実装
Future<void> signInAnonymouslyAndSaveUser(
{required BuildContext context, String? email, String? name}) async {
final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
final FirestoreUser firestoreUser =
_createFirestoreUser(email: email, name: name);
final Map<String, dynamic> userData = firestoreUser.toJson();
try {
//匿名ログイン
final userCredential = await firebaseAuth.signInAnonymously();
final User? user = userCredential.user;
// ユーザデータの追加
if (user != null) {
await FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.set(userData);
}
//画面遷移
await _navigateToMainPage(context);
} on FirebaseAuthException catch (e) {
await _showErrorDialog(context, e.toString());
}
}
FirestoreUser _createFirestoreUser({String? email, String? name}) {
final Timestamp now = Timestamp.now();
const uuid = Uuid();
final uid = uuid.v4();
//デフォルト値を使う
return FirestoreUser(
createAt: now,
email: email ?? '未設定',
updatedAt: now,
uid: uid,
userName: name ?? '匿名ユーザー',
);
}
➁の実装。
Future<void> linkUserAccount(
BuildContext context, String email, String password, String name) async {
try {
// Emailとpasswordを登録
final credential =
EmailAuthProvider.credential(email: email, password: password);
//linkWithCredentialが成功したら、リンク完了
final userCredential = await FirebaseAuth.instance.currentUser
?.linkWithCredential(credential);
final User? user = userCredential?.user;
if (user == null) {
throw FirebaseAuthException(
code: 'user-not-found',
message: 'User not found after linking.',
);
}
final String uid = user.uid;
//ユーザデータ変更
await createFirestoreUser(
uid: uid,
email: email,
name: name,
);
//画面遷移
await _navigateToMainPage(context);
} on FirebaseAuthException catch (e) {
print('${e.code}, ${e.message}');
}
}
Discussion