【问题标题】:Flutter: Method was called on null Eventhough declaredFlutter:方法在 null 上调用,尽管已声明
【发布时间】:2020-06-01 11:27:56
【问题描述】:

我在以下代码中出现错误。我已经声明了所有函数并且没有编译时错误。它在运行时显示错误。 错误在以下方式。

NoSuchMethodError: The method 'getCurrentUser' was called on null.
Reciever: null
Tried calling: getCurrentUser()
see also: https://flutter.dev/docs/testing/errors

此代码放置在 MappingPage.dart 文件中,该文件将由 main.dart 文件调用。

import 'package:flutter/material.dart';
import 'loginPage.dart';
import 'homePage.dart';
import 'authentication.dart';

class MappingPage extends StatefulWidget
{
  final AuthImplementation auth;

  MappingPage({
    this.auth
  });

  @override
  _MappingPageState createState() => new _MappingPageState();
}
enum AuthStatus
{
  notSignedIn,
  signedIn,
}

class _MappingPageState extends State<MappingPage>
{
  AuthStatus authStatus = AuthStatus.notSignedIn;


  @override
  void initState()
  {
    super.initState();

    widget.auth.getCurrentUser().then((firebaseUserId)
    {
      setState(() {
        authStatus = firebaseUserId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
        print("Initial state");
      });
    });
  }


  void _signedIn()
  {
    setState(() {
     authStatus = AuthStatus.signedIn;
    });
  }

  void _signedOut()
  {
    setState(() {
     authStatus = AuthStatus.notSignedIn;
    });
  }


  @override
  Widget build(BuildContext context)
  {
    switch(authStatus)
    {
      case AuthStatus.notSignedIn:
      return loginPage
      (
        auth: widget.auth,
        onSignedIn: _signedIn,
      );
      case AuthStatus.signedIn:
      return homePage
      (
        auth: widget.auth,
        onSignedOut: _signedOut,
      );
    }
    return null;
  }
}

此代码为 authentication.dart 文件

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

abstract class AuthImplementation
{
  Future<String> SignIn(String email, String password);
  Future<String> getCurrentUser();
  Future<void> signOut();
}

class Auth implements AuthImplementation
{
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  final GoogleSignIn _googleSignIn = GoogleSignIn();

  Future<String> SignIn(String email, String password) async
  {
    try {

      GoogleSignInAccount googleSignInAccount = await _googleSignIn.signIn();
      GoogleSignInAuthentication googleAuth =
          await googleSignInAccount.authentication;

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

      FirebaseUser user = (await _firebaseAuth.signInWithCredential(credential)).user;
      // updateUserData(user);
      print("user name: ${user.displayName}");

      // loading.add(false);
      return user.uid;
    } catch (error) {
      return error;
    }
  }
  Future<String> getCurrentUser() async
  {
    FirebaseUser user = await _firebaseAuth.currentUser();
    return user.uid;
  }

  Future<void> signOut() async
  {
    _firebaseAuth.signOut();
  }
}

我不知道它有什么错误。请帮忙!

【问题讨论】:

  • 似乎widget.auth 为空。您是否正确设置了该值?
  • @MidhunMP 我可以知道如何设置值吗?
  • 从哪里以及如何初始化 MappingPage
  • @MidhunMP 是的,明白了,谢谢。我没有在我的main.dart 文件中设置MappingPage 的值,谢谢!现在它工作正常!
  • 不客气,编码快乐!!! :)

标签: android firebase flutter firebase-authentication


【解决方案1】:

widget.auth为空,需要设置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2020-11-06
    • 2021-02-16
    • 2019-09-23
    • 2019-02-02
    • 2020-06-04
    • 2021-09-23
    相关资源
    最近更新 更多