UserProfile аварийно завершает работу после auth.getCurrentUser () - PullRequest
0 голосов
/ 05 августа 2020

Я делаю приложение в трепете, и сейчас, когда я пытаюсь показать имя пользователя в профиле, я получил эту ошибку

════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building UserPage(dirty, dependencies: [MediaQuery], state: _UserProfile#ca57c):
The getter 'auth' was called on null.
Receiver: null
Tried calling: auth

The relevant error-causing widget was
    UserPage 
lib/HomePage.dart:92
When the exception was thrown, this was the stack
#0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:53:5)
#1      _UserProfile.build 
package:tariffo/UserPage.dart:131
#2      StatefulElement.build 
package:flutter/…/widgets/framework.dart:4619
#3      ComponentElement.performRebuild 
package:flutter/…/widgets/framework.dart:4502
#4      StatefulElement.performRebuild 
package:flutter/…/widgets/framework.dart:4675
...
═══════════════════════════════════════════════════════════════════════════════

и я использовал этот код

FutureBuilder(
                              future:
                                  Provider.of(context).auth.getCurrentUser(),
                              builder: (context, snapshot) {
                                if (snapshot.connectionState ==
                                    ConnectionState.done) {
                                  return Text("${snapshot.data.displayName}",
                                      style: TextStyle(
                                        color: Colors.black,
                                        fontWeight: FontWeight.bold,
                                        fontSize: 22,
                                      ));
                                } else {
                                  return CircularProgressIndicator();
                                }
                              },
                            ),

Это код, который я использовал для своего auth.dart


    import 'package:firebase_auth/firebase_auth.dart';
    import 'package:google_sign_in/google_sign_in.dart';
    import 'User.dart';

    String email, name, photoUrl;

    class Authentication {
      final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
      final GoogleSignIn _googleSignIn = GoogleSignIn();

      Stream<String> get onAuthStateChanged => _firebaseAuth.onAuthStateChanged.map(
            (FirebaseUser user) => user?.uid,
          );

      // GET UID
      Future<String> getCurrentUID() async {
        return (await _firebaseAuth.currentUser()).uid;
      }

      // GET CURRENT USER
      Future getCurrentUser() async {
        return await _firebaseAuth.currentUser();
      }

      // Email & Password Sign Up
      Future<String> createUserWithEmailAndPassword(
          String email, String password, String name) async {
        final authResult = await _firebaseAuth.createUserWithEmailAndPassword(
          email: email,
          password: password,
        );

        // Update the username
        await updateUserName(name, authResult.user);
        return authResult.user.uid;
      }

      Future updateUserName(String name, FirebaseUser currentUser) async {
        var userUpdateInfo = UserUpdateInfo();
        userUpdateInfo.displayName = name;
        await currentUser.updateProfile(userUpdateInfo);
        await currentUser.reload();
      }

      // Email & Password Sign In
      Future<String> signInWithEmailAndPassword(
          String email, String password) async {
        return (await _firebaseAuth.signInWithEmailAndPassword(
                email: email, password: password))
            .user
            .uid;
      }

      // Sign Out
      signOut() {
        return _firebaseAuth.signOut();
      }

      // Reset Password
      Future sendPasswordResetEmail(String email) async {
        return _firebaseAuth.sendPasswordResetEmail(email: email);
      }

      // Create Anonymous User
      Future singInAnonymously() {
        return _firebaseAuth.signInAnonymously();
      }

      Future convertUserWithEmail(
          String email, String password, String name) async {
        final currentUser = await _firebaseAuth.currentUser();

        final credential =
            EmailAuthProvider.getCredential(email: email, password: password);
        await currentUser.linkWithCredential(credential);
        await updateUserName(name, currentUser);
      }

      Future convertWithGoogle() async {
        final currentUser = await _firebaseAuth.currentUser();
        final GoogleSignInAccount account = await _googleSignIn.signIn();
        final GoogleSignInAuthentication _googleAuth = await account.authentication;
        final AuthCredential credential = GoogleAuthProvider.getCredential(
          idToken: _googleAuth.idToken,
          accessToken: _googleAuth.accessToken,
        );
        await currentUser.linkWithCredential(credential);
        await updateUserName(_googleSignIn.currentUser.displayName, currentUser);
      }

      // GOOGLE
      Future<String> signInWithGoogle() async {
        final GoogleSignInAccount account = await _googleSignIn.signIn();
        final GoogleSignInAuthentication _googleAuth = await account.authentication;
        final AuthCredential credential = GoogleAuthProvider.getCredential(
          idToken: _googleAuth.idToken,
          accessToken: _googleAuth.accessToken,
        );
        return (await _firebaseAuth.signInWithCredential(credential)).user.uid;
      }

      // APPLE

    }

    class NameValidator {
      static String validate(String value) {
        if (value.isEmpty) {
          return "Name can't be empty";
        }
        if (value.length < 2) {
          return "Name must be at least 2 characters long";
        }
        if (value.length > 50) {
          return "Name must be less than 50 characters long";
        }
        return null;
      }
    }

    class EmailValidator {
      static String validate(String value) {
        if (value.isEmpty) {
          return "Email can't be empty";
        }
        return null;
      }
    }

    class PasswordValidator {
      static String validate(String value) {
        if (value.isEmpty) {
          return "Password can't be empty";
        }
        return null;
      }
    }


, а это код для User.dart

import 'package:flutter/material.dart';

class User {
  final String uid;
  User({this.uid});
  String adress;
  bool business;
  Map<String, dynamic> toJson() => {
        'adress': adress,
        'business': business,
      };
}

Теперь он просто появляется на красном фоне, когда я пытаюсь открывает страницу профиля, нажав кнопку со значком профиля

введите описание изображения здесь

provider_widget.dart

import 'package:flutter/material.dart';
import 'auth.dart';

class Provider extends InheritedWidget {
  final Authentication auth;

  Provider({Key key, Widget child, this.auth}) : super(key: key, child: child);

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) {
    return true;
  }

  static Provider of(BuildContext context) =>
      (context.inheritFromWidgetOfExactType(Provider) as Provider);
}
...