首页 > 解决方案 > 在 Flutter 应用中使用用户的谷歌账户头像

问题描述

美好的一天,我目前正在使用 firebase/flutter 创建一个应用程序,用户可以在其中登录以进入下一页。我的登录和firebase都处于正常工作状态,但我遇到的一个问题是能够在初始登录时访问用户的个人资料图片。附加的gif比我能解释的要好,但基本上是在我登录时第一次,用户图像不存在,但如果我退出并返回(用户仍然登录),然后加载图片:

在此处输入图像描述

问题:用户的个人资料图片在首次登录时不加载,并且仅在退出并重新进入时仍然登录时出现。

假设:当我的数据完成加载时,用户的数据没有足够的时间加载。或者:我在初次登录时没有正确调用数据。

的目标是:在单击登录按钮和下一页完全加载之前加载用户的详细信息(照片/姓名/电子邮件)。

代码: 登录按钮:

Widget _signInButton() {
    return OutlineButton(
      splashColor: Colors.grey,
      onPressed: () async {
        try {
          final result = await InternetAddress.lookup('google.com');
          if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
            print('connected');
            bool result = await signInWithGoogle(); //assumed issue
            if (result) {
              Navigator.pushNamed(context, '/specials-page');
              fireBaseAnalyticsDataObject.onLogin(result);
            }
            else
              print("error logging in");
          }
        } on SocketException catch (_) {
          noInternetAlertDialog(context);
          print('not connected');
        }
      },

登录.dart:

final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn googleSignIn = new GoogleSignIn();
final MyTabsState tabPageObject = new MyTabsState();

Future<bool> signInWithGoogle() async {
  try{
    final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
    final GoogleSignInAuthentication googleSignInAuthentication =
    await googleSignInAccount.authentication;

    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleSignInAuthentication.accessToken,
      idToken: googleSignInAuthentication.idToken,
    );

    final AuthResult authResult = await _auth.signInWithCredential(credential);
    final FirebaseUser user = authResult.user;

    MyTabs(
      userDisplayName: user.displayName,
      userPhotoUrl: user.photoUrl,
      userEmail: user.email,
    );

    globalData.user = user; //this accesses .uid / .displayName / .email / .photoUrl

    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);

    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    return true;
  } catch (error) {
    return false;
  }
}

感谢您的任何帮助。

标签: firebaseflutterfirebase-authentication

解决方案


如果页面上有一个刚刚更新的变量,在里面调用它setState()可能会解决问题。您需要Image.network()在登录后检查是否收到了预期的用户照片 URL,因为该图像在应用程序恢复中按预期工作。您提供的代码并未展示照片 URL 是如何被访问并显示在着陆页上的。


推荐阅读