gpt4 book ai didi

ios - Flutter Firebase Auth with Apple 不会注销

转载 作者:行者123 更新时间:2023-12-05 00:23:11 24 4
gpt4 key购买 nike

我已经为 Flutter 集成了 Apple 登录。
一切正常,直到我必须从 Stores() 页面注销为止。
应用登陆页面(主页)显示了一系列用于登录不同应用的按钮:

  • 谷歌
  • 匿名
  • 苹果
  • 邮箱和密码

  • 他们都可以使用注销按钮注销,但 Apple 不行。
    这是我的代码
    main.dart
    class Main extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    return StreamProvider<User>.value(
    value: AuthService().user,
    child: MaterialApp(
    home: Wrapper(),
    routes: {
    "/stores": (_) => Stores()
    },
    ));
    }
    }
    Wrapper.dart
    class Wrapper extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    final user = Provider.of<User>(context);

    if (user == null) {
    return Home(); <-- Landing page before login
    } else {
    return Stores(); <-- Landing page after login, where the logout button is
    }
    }
    }

    首页.dart
    class _HomeState extends State<Home> {
    final AuthService _auth = AuthService();
    bool loading = false;

    final welcomeText = 'Welcome';
    final subtitle = 'Make grocery chores easier';
    final anonymousButtonText = 'Skip';

    @override
    Widget build(BuildContext context) {
    return Stack(children: [
    AuthLayout(),
    Scaffold(
    backgroundColor: Colors.transparent,
    appBar: AppBar(
    title: Center(child: Text(welcomeText)),
    backgroundColor: Colors.transparent,
    ),
    body: SingleChildScrollView(
    child: ConstrainedBox(
    constraints: BoxConstraints(),
    child: Center(
    child: Column(
    mainAxisAlignment: MainAxisAlignment.start,
    children: <Widget> [

    // Sign In with Apple
    Padding(
    padding: EdgeInsets.all(8.0),
    child: FutureBuilder<Object>(
    future: _auth.appleSignInAvailable,
    builder: (context, snapshot) {
    if (snapshot.data == true) {
    return AppleSignInButton(
    onPressed: () async {
    FirebaseUser user =
    await _auth.appleSignIn();
    if (user != null) {
    Navigator.pushReplacementNamed(context, "/stores");
    }
    },
    );
    } else {
    return Container();
    }
    })) ....

    AuthService.dart
    class AuthService {
    final FirebaseAuth _auth = FirebaseAuth.instance;
    final GoogleSignIn _googleSignIn = new GoogleSignIn();

    // Create user object based on FirebaseUser
    User _userFromFirebaseUser(FirebaseUser user) {
    return user != null ? User(uid: user.uid) : null;
    }

    // Auth change user stream
    Stream<User> get user {
    return _auth.onAuthStateChanged.map(
    _userFromFirebaseUser);
    }

    // SignIn with Google
    Future signInGoogle() async {
    GoogleSignInAccount googleSignInAccount = await _googleSignIn.signIn();

    GoogleSignInAuthentication googleSignInAuthentication =
    await googleSignInAccount.authentication;

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

    try {
    AuthResult result = (await _auth.signInWithCredential(credential));
    FirebaseUser user = result.user;
    return _userFromFirebaseUser(user);
    } catch (e) {
    print(e.toString());
    return null;
    }
    }

    // SignIn with Apple
    // Determine if Apple Signin is available on device
    Future<bool> get appleSignInAvailable => AppleSignIn.isAvailable();
    Future appleSignIn() async {
    try {
    final AuthorizationResult appleResult =
    await AppleSignIn.performRequests([
    AppleIdRequest(requestedScopes: [Scope.email, Scope.fullName])
    ]);

    if (appleResult.error != null) {
    // handle error from Apple
    }

    final AuthCredential credential = OAuthProvider(providerId: 'apple.com')
    .getCredential(
    accessToken: String.fromCharCodes(
    appleResult.credential.authorizationCode),
    idToken:
    String.fromCharCodes(appleResult.credential.identityToken));

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

    return user;

    } catch (error) {
    print(error);
    return null;
    }
    }

    // SignOut
    Future signOut() async {
    try {
    return await _auth.signOut(); <-- Should I do something different here for Apple?
    } catch (e) {
    print(e.toString());
    return null;
    }
    }
    }

    所有其他应用程序都正确注销,但 Apple 没有。由于它使用/routes,我应该在注销中做一些不同的事情吗?
    任何帮助深表感谢!!
    非常感谢

    最佳答案

    await _firebaseAuth.signOut();
    使用上面的代码进行注销
    并检查 Firebase IOS 配置

    关于ios - Flutter Firebase Auth with Apple 不会注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63285757/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com