【问题标题】:Using user's Google account profile picture in Flutter app在 Flutter 应用中使用用户的谷歌账户头像
【发布时间】:2020-05-07 09:49:10
【问题描述】:

您好,我目前正在使用 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;
  }
}

感谢您的所有帮助。

【问题讨论】:

  • 你在使用provider包吗?
  • 我不是。我现在已经通读了,但不明白这有什么帮助?
  • stackoverflow.com/a/56218510/4712391 如果您想使用提供程序包,这可能会有所帮助。这用于跟踪用户对象,如果它发生变化,您的个人资料图片也会发生变化

标签: firebase flutter firebase-authentication


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多