我正在尝试将Appwrite的Google OAuth提供程序添加到Flutter应用程序中(使用Riverpod进行状态管理)。通过电子邮件和密码,我可以登录/注册并推送到home_view.dart登录后使用Google,我可以正确地看到Appwrite上的用户数据,但收到*会话*变量null,并且无法重定向到home_view.dart(因为会话变量为空)。然后,当我按下热重载时,我看到用户google登录的home_view.dart。
有人能帮帮我吗?太感谢了。
auth_API.dart
final authAPIProvider = Provider((ref) {
final account = ref.watch(appwriteAccountProvider);
return AuthAPI(account: account);
});
abstract class IAuthAPI {
FutureEither<model.User> signUp({
required String email,
required String password,
});
FutureEither<model.Session> login({
required String email,
required String password,
});
FutureEither<model.Session> loginWithGoogle();
Future<model.User?> currentUserAccount();
FutureEitherVoid logout();
}
class AuthAPI implements IAuthAPI {
final Account _account;
AuthAPI({required Account account}) : _account = account;
@override
Future<model.User?> currentUserAccount() async {
try {
return await _account.get();
} on AppwriteException {
return null;
} catch (e) {
return null;
}
}
@override
FutureEither<model.User> signUp({
required String email,
required String password,
}) async {
try {
final account = await _account.create(
userId: ID.unique(),
email: email,
password: password,
);
return right(account);
} on AppwriteException catch (e, stackTrace) {
return left(
Failure(e.message ?? 'Some unexpected error occurred', stackTrace),
);
} catch (e, stackTrace) {
return left(
Failure(e.toString(), stackTrace),
);
}
}
@override
FutureEither<model.Session> login({
required String email,
required String password,
}) async {
try {
final session = await _account.createEmailSession(
email: email,
password: password,
);
return right(session);
} on AppwriteException catch (e, stackTrace) {
return left(
Failure(e.message ?? 'Some unexpected error occurred', stackTrace),
);
} catch (e, stackTrace) {
return left(
Failure(e.toString(), stackTrace),
);
}
}
@override
FutureEither<model.Session> loginWithGoogle(
) async {
try {
final session = await _account.createOAuth2Session(
provider: 'google',
success: "",
failure: "",
);
debugPrint(session);
return right(session);
} on AppwriteException catch (e, stackTrace) {
return left(
Failure(e.message ?? 'Some unexpected error occurred', stackTrace),
);
} catch (e, stackTrace) {
return left(
Failure(e.toString(), stackTrace),
);
}
}
@override
FutureEitherVoid logout() async {
try {
await _account.deleteSession(
sessionId: 'current',
);
return right(null);
} on AppwriteException catch (e, stackTrace) {
return left(
Failure(e.message ?? 'Some unexpected error occurred', stackTrace),
);
} catch (e, stackTrace) {
return left(
Failure(e.toString(), stackTrace),
);
}
}
}
auth_controller.dart
final authControllerProvider =
StateNotifierProvider<AuthController, bool>((ref) {
return AuthController(
authAPI: ref.watch(authAPIProvider),
userAPI: ref.watch(userAPIProvider),
);
});
final currentUserDetailsProvider = FutureProvider((ref) {
final currentUserId = ref.watch(currentUserAccountProvider).value!.$id;
debugPrint("Utente corrente: $currentUserId");
final userDetails = ref.watch(userDetailsProvider(currentUserId));
return userDetails.value;
});
final userDetailsProvider = FutureProvider.family((ref, String uid) {
final authController = ref.watch(authControllerProvider.notifier);
return authController.getUserData(uid);
});
final currentUserAccountProvider = FutureProvider((ref) {
final authController = ref.watch(authControllerProvider.notifier);
return authController.currentUser();
});
class AuthController extends StateNotifier<bool> {
final AuthAPI _authAPI;
final UserAPI _userAPI;
AuthController({
required AuthAPI authAPI,
required UserAPI userAPI,
}) : _authAPI = authAPI,
_userAPI = userAPI,
super(false);
// state = isLoading
Future<model.User?> currentUser() => _authAPI.currentUserAccount();
void signUp({
required String email,
required String password,
required BuildContext context,
}) async {
state = true;
final res = await _authAPI.signUp(
email: email,
password: password,
);
state = false;
res.fold(
(l) => showSnackBar(context, l.message),
(r) async {
UserModel userModel = UserModel(
email: email,
name: getNameFromEmail(email),
followers: const [],
following: const [],
profilePic: '',
bannerPic: '',
uid: r.$id,
bio: '',
isTwitterBlue: false,
);
final res2 = await _userAPI.saveUserData(userModel);
res2.fold((l) => showSnackBar(context, l.message), (r) {
showSnackBar(context, 'Accounted created! Please login.');
Navigator.push(context, LoginView.route());
});
},
);
}
void login({
required String email,
required String password,
required BuildContext context,
}) async {
state = true;
final res = await _authAPI.login(
email: email,
password: password,
);
state = false;
res.fold(
(l) => showSnackBar(context, l.message),
(r) {
Navigator.push(context, HomeView.route());
},
);
}
void loginWithGoogle({
required BuildContext context,
}) async {
state = true;
final res = await _authAPI.loginWithGoogle(
);
state = false;
res.fold(
(l) => showSnackBar(context, l.message),
(r) {
Navigator.push(context, HomeView.route());
},
);
}
Future<UserModel> getUserData(String uid) async {
final document = await _userAPI.getUserData(uid);
final updatedUser = UserModel.fromMap(document.data);
return updatedUser;
}
void logout(BuildContext context) async {
final res = await _authAPI.logout();
res.fold((l) => null, (r) {
Navigator.pushAndRemoveUntil(
context,
SignUpView.route(),
(route) => false,
);
});
}
}
1条答案
按热度按时间vsikbqxv1#
我解决了这个问题。在auth_API.dart上,我<model.Session>从FutureEither<model.Session>loginWithGoogle和<model.Session>FutureEither<model.Session>loginWithGoogle()中删除;