我想让用户使用谷歌登录应用程序,但屏幕上没有弹出窗口。我该怎么做才能出现弹出窗口?当我按下“继续使用 Google”按钮时,它什么也没做。
当我调试代码时,调试器直接转到最后一个打印语句 -
print("GOOGLE SIGN IN: ${googleSignIn.clientId}");
这是我的代码-
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
part 'google_sign_in_event.dart';
part 'google_sign_in_state.dart';
class GoogleSignInBloc extends Bloc<GoogleSignInEvent, GoogleSignInState> {
GoogleSignInBloc() : super(GoogleSignInInitial()) {
on<GoogleLogInEvent>((event, emit) {
GoogleSignIn googleSignIn = GoogleSignIn();
GoogleSignInAccount? _user;
// GoogleSignInAccount get user => _user!;
//final googlelogin = MeditationGoogleSignIn().googleLogIn();
Future googleLogIn() async {
try {
final googleUser = await googleSignIn.signIn();
if (googleUser == null) {
print("NO GOOGLE USER");
return null;
}
_user = googleUser;
final googleAuth = await googleUser.authentication;
final credential = GoogleAuthProvider.credential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
await FirebaseAuth.instance.signInWithCredential(credential);
} catch (e) {
print("THERE IS AN ERROR IN LOGIN: ${e.toString()}");
}
}
print("GOOGLE SIGN IN: ${googleSignIn.clientId}");
});
on<GoogleLogOutEvent>((event, emit) {
Future googleLogOut() async {
final googleSignIn = GoogleSignIn();
await googleSignIn.disconnect();
FirebaseAuth.instance.signOut();
}
});
}
}
尝试添加范围:
GoogleSignIn(scopes: ['email', 'profile'])
有两种方法可以使 Google 登录弹出窗口出现在网络上:
if (kIsWeb) {
final GoogleAuthProvider provider = GoogleAuthProvider()
.setCustomParameters({'prompt': 'select_account'});
await _firebaseAuth.signInWithPopup(provider);
}
class loginGoogleButton extends StatefulWidget {
const loginGoogleButton({
Key? key,
}) : super(key: key);
@override
State<loginGoogleButton> createState() => _loginGoogleButtonState();
}
class _loginGoogleButtonState extends State<loginGoogleButton> {
GoogleSignInAccount? user;
GoogleSignIn googleSignIn = GoogleSignIn(
clientId: const String.fromEnvironment('GOOGLE_CLIENT_ID'),
);
@override
void initState() {
googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount? account) {
setState(() {
user = account;
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
final body = ElevatedButtonLab.normal(
brightness: Brightness.light,
child: Padding(
padding:
const EdgeInsets.only(right: 10, top: 12, bottom: 12, left: 12),
child: (GoogleSignInPlatform.instance as web.GoogleSignInPlugin)
.renderButton(),
),
);
return body;
}
}
注意:第二个选项更复杂,需要您修改 UI 并检查导入是否也是移动设备。不过,它确实有效。