【问题标题】:NoSuchMethodError: The method 'createUserWithEmailAndPassword' was called on nullNoSuchMethodError:在 null 上调用了方法“createUserWithEmailAndPassword”
【发布时间】:2021-03-11 22:28:57
【问题描述】:
import 'package:flutter/material.dart';
import 'package:Trial/app/services/auth.dart';

class RegisterForm extends StatefulWidget {
  RegisterForm({@required this.auth});
  final AuthBase auth;

  @override
  _RegisterFormState createState() => _RegisterFormState();
}

class _RegisterFormState extends State<RegisterForm> {
  // final TextEditingController _firstnameController = TextEditingController();
//  final TextEditingController _lastnameController = TextEditingController();
  final TextEditingController _emailController = TextEditingController();
  final TextEditingController _passwordController = TextEditingController();

  //String get _fname => _firstnameController.text;
  //String get _lname => _lastnameController.text;
  String get _email => _emailController.text;
  String get _password => _passwordController.text;

  void _register() async {
    try {
      print('$_email & $_password');
      await widget.auth.createUserWithEmailAndPassword(_email, _password);
      Navigator.of(context).pop();
    } catch (e) {
      print(e.toString());
    }
  }

  List<Widget> _buildChildren() {
    return [
      TextField(
        decoration: InputDecoration(labelText: 'First Name', hintText: 'John'),
      ),
      TextField(
        decoration: InputDecoration(labelText: 'Last Name', hintText: 'Doe'),
      ),
      TextField(
        controller: _emailController,
        decoration:
            InputDecoration(labelText: 'Email', hintText: 'yourmail@mail.com'),
        onChanged: (_email) => _updateState(),
      ),
      TextField(
        controller: _passwordController,
        decoration: InputDecoration(
          labelText: 'Password',
        ),
        obscureText: true,
        onChanged: (_password) => _updateState(),
      ),
      TextField(
        decoration:
            InputDecoration(labelText: 'Account No.', hintText: '123456789-0'),
      ),
      SizedBox(
        height: 5.0,
      ),
      TextField(
        decoration: InputDecoration(labelText: ' MAP LOCATION'),
      ), //LOCATION CAPTURE GOING HERE
      RaisedButton(
        child: Text('Register'),
        onPressed: _register,
      ),
    ];
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: ListView(
        children: _buildChildren(),
      ),
    );
  }

  void _updateState() {
    setState(() {});
  }
}

我得到的错误是这样的

I/flutter (6751): NoSuchMethodError: 方法 'createUserWithEmailAndPassword' 在 null 上被调用。

I/flutter (6751):接收器:null ? I/flutter (6751):尝试调用:createUserWithEmailAndPassword("test@gmail.com", "password")

我在颤振和火力基地相当新。我正在尝试注册用户,但 auth 类中的方法传递为 null。

import 'package:Trial/app/services/auth.dart';
import 'package:Trial/app/signin/register_form.dart';
import 'package:flutter/material.dart';

class RegisterPage extends StatelessWidget {
  RegisterPage({@required this.auth});
  final AuthBase auth;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Register Account'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Card(child: RegisterForm(auth: auth)),
      ),
    );
  }
}

这将是我的身份验证文件

 import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.dart';

class User {
  User({@required this.uid});
  final String uid;
}

abstract class AuthBase {
  Stream<User> get onAuthStateChanged;
  Future<User> currentUser();
  Future<User> signInAnonymously();
  Future<User> signInWithEmailAndPassword(String email, String password);
  Future<User> createUserWithEmailAndPassword(String email, String password);
  Future<void> signOut();
}

class Auth implements AuthBase {
  /*to check to see if anyone is signed in*/
  final _firebaseAuth = FirebaseAuth.instance;

  User _userFromFirebsae(FirebaseUser user) {
    if (user == null) {
      return null;
    }
    return User(uid: user.uid);
  }

  @override
  Stream<User> get onAuthStateChanged {
    return _firebaseAuth.onAuthStateChanged.map(_userFromFirebsae);
  }

  @override
  Future<User> currentUser() async {
    final user = await _firebaseAuth.currentUser();
    return _userFromFirebsae(user);
  }

/*to sign in without logining in*/
  @override
  Future<User> signInAnonymously() async {
    final authResult = await _firebaseAuth.signInAnonymously();
    return _userFromFirebsae(authResult.user);
  }

  @override
/*to sign in with email*/
  Future<User> signInWithEmailAndPassword(String email, String password) async {
    final authResult = await _firebaseAuth.signInWithEmailAndPassword(
        email: email, password: password);
    return _userFromFirebsae(authResult.user);
  }

//create email
  @override
  Future<User> createUserWithEmailAndPassword(
      String email, String password) async {
    final authResult = await _firebaseAuth.createUserWithEmailAndPassword(
        email: email, password: password);
    return _userFromFirebsae(authResult.user);
  }

/*to sign out of app*/
  @override
  Future<void> signOut() async {
    await _firebaseAuth.signOut();
  }
}

【问题讨论】:

  • 显示初始化RegisterForm并传递auth的代码
  • @SwiftiSwift 我试图在这里添加它,但它的格式不正确,所以我将它添加到它自己的问题中
  • 向我们展示你在哪里传递真正的auth 参数和内容。你在哪里初始化RegisterPage
  • 有点困惑的是它没有传入等待 widget.auth.createUserWithEmailAndPassword(_email, _password);
  • 我们需要查看您第一次通过身份验证的位置。

标签: flutter firebase-authentication


【解决方案1】:

您从未在以下位置初始化auth

class RegisterPage extends StatelessWidget {
  RegisterPage({@required this.auth});
  final AuthBase auth;
  ...

您需要将其初始化为:

  final FirebaseAuth auth = FirebaseAuth.instance;

【讨论】:

  • 我导入 FirebaseAuth 但我仍然收到错误“无法将 'FirebaseAuth' 类型的值分配给 'AuthBase' 类型的变量。尝试更改变量的类型,或强制转换'AuthBase' 的右手类型。”在 required 中我得到一个错误'auth' is final 并且在声明它时被赋予了一个值,所以它不能被设置为一个新值。尝试删除其中一项初始化。
  • 是的,您需要将字段更改为FirebaseAuth,以匹配docs。我在回答中更新了这一点。
  • 嘿,我已经尝试过,当我更改它时 RegisterPage({@required this.auth}); auth 给出了这个错误 'auth' 是最终的,并且在声明时被赋予了一个值,所以它不能被设置为一个新的值。尝试删除其中一项初始化。
  • 嘿,谢谢,我通过了我必须取出所需的值,然后将值传递给 createwithemailandpassword 方法,它创建了一个用户并登录我不太了解它是如何工作的,但我希望我能理解它,这样我就可以在未来建立一些好的东西
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 2021-11-30
  • 2021-09-29
  • 2021-06-18
  • 2019-12-23
  • 2020-11-20
  • 2021-11-15
  • 2021-07-14
相关资源
最近更新 更多