Flutter NoSuchMethodError:getter';名字';在null上调用了。Receiver:null尝试调用:firstName单击register按钮时出现此错误

Flutter NoSuchMethodError:getter';名字';在null上调用了。Receiver:null尝试调用:firstName单击register按钮时出现此错误,flutter,sqflite,Flutter,Sqflite,当我在登录页面中单击“注册”按钮时,出现此错误。我想注册用户,然后根据电子邮件id和密码登录用户。我不知道该做什么,也不知道出了什么问题 我有UserLoginModel.dart,db\u helper.dart,Login\u ctr.dart文件 此行中的错误: firstnameController.text = userLoginModel.firstName; UserRegistration.dart import 'package:customer/models/UserLog

当我在登录页面中单击“注册”按钮时,出现此错误。我想注册用户,然后根据电子邮件id和密码登录用户。我不知道该做什么,也不知道出了什么问题

我有
UserLoginModel.dart
db\u helper.dart
Login\u ctr.dart
文件

此行中的错误:

firstnameController.text = userLoginModel.firstName;
UserRegistration.dart

import 'package:customer/models/UserLoginModel.dart';
    import 'package:customer/screens/add_person.dart';
    import 'package:customer/utils/db_helper.dart';
    import 'package:flutter/material.dart';
    import 'package:customer/screens/UserLogin.dart';
    import 'package:customer/utils/Login_ctr.dart';
    class UserRegistration extends StatefulWidget{
      final UserLoginModel userLoginModel;
    
      //const UserRegistration({Key key, this.userLoginModel}) : super(key: key);
      UserRegistration(this. userLoginModel);
      @override
      State<StatefulWidget> createState() {
    
       return UserRegistrationState();
      }
    
    }
    
    class UserRegistrationState extends State<UserRegistration>{
      DatabaseHelper helper = DatabaseHelper();
      UserLoginModel userLoginModel;
    
      var _minimumPadding = 5.0;
      bool isHiddenPassword=true;
      final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
    
      TextEditingController firstnameController=TextEditingController();
      TextEditingController lastnameController=TextEditingController();
      TextEditingController passwordController=TextEditingController();
      TextEditingController cpasswordController=TextEditingController();
      TextEditingController emailController=TextEditingController();
      TextEditingController mobilenoController=TextEditingController();
      TextEditingController addressController=TextEditingController();
    
    
      @override
      Widget build(BuildContext context) {
        TextStyle textStyle=Theme.of(context).textTheme.title;
        var height = MediaQuery.of(context).size.height;
        var width = MediaQuery.of(context).size.width;
    
        firstnameController.text = userLoginModel.firstName;
        lastnameController.text = userLoginModel.lastName;
        passwordController.text = userLoginModel.password;
        emailController.text = userLoginModel.emailId;
        mobilenoController.text = userLoginModel.mobileNum;
        addressController.text = userLoginModel.address;
    
        return Scaffold(
            backgroundColor: Colors.white,
            appBar: AppBar(
              title: Text('Registration'),),
          body:Form(
                key: _formkey,
             
        child:ListView(
    
              children: <Widget>[
                Text("Registration".toUpperCase(),),
               
                Padding(
                  padding: EdgeInsets.all(_minimumPadding*3),
                            child: TextFormField(
                            controller: firstnameController,
                            style:textStyle,
                            validator: (String value){
                              if(value.isEmpty)
                              {
                                return 'Please Enter First Name';
                              }
                              return null;
                            },
                            onChanged: (String value){
                              //name = value;
                              insertuser();
    
                            },
                            decoration: InputDecoration(
                                prefixIcon: Icon(Icons.person),
                                labelText: 'FirstName',
                                hintText: 'FirstName',
    
                                border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(25.0),
    
                                ),)
                        ),
                      ),
                Padding(
                  padding: EdgeInsets.all(_minimumPadding*3),
                  child: TextFormField(
                      controller: lastnameController,
                      style:textStyle,
                      validator: (String value){
                        if(value.isEmpty)
                        {
                          return 'Please Enter Last Name';
                        }
                        return null;
                      },
                      onSaved: (String value){
                        userLoginModel.last_name = lastnameController.text;
                      },
                      decoration: InputDecoration(
                        prefixIcon: Icon(Icons.person),
                        labelText: 'Last name',
                        hintText: 'Last name',)
                  ),
                ),
                Padding(
                    padding: EdgeInsets.all(_minimumPadding*3),
    
                        child:TextFormField(
                            controller: passwordController,
                            style:textStyle,
                            validator: (String value){
                              if(value.isEmpty)
                              {
                                return 'Please a Enter Password';
                              }
                              return null;
                            },
                            obscureText:isHiddenPassword,
                            decoration: InputDecoration(
                                prefixIcon: Icon(Icons.lock),
                                suffixIcon: InkWell(
                                    onTap:_togglePasswordView,
                                    child: Icon(Icons.visibility)),
    
                                labelText: 'Password',
                                hintText: 'Password',
                            )
                        )),
                Padding(
                    padding: EdgeInsets.all(_minimumPadding*3),    child:Expanded(
                        child:TextFormField(
                            controller: cpasswordController,
                            style:textStyle,
                            obscureText:true,
                            validator: (String value){
                              if(value.isEmpty)
                              {
                                return 'Please re-enter password';
                              }
                              print(passwordController.text);
                              print(cpasswordController.text);
                              if(passwordController.text!=cpasswordController.text){
                                return "Password does not match";
                              }
                              return null;
                            },
                            onSaved: (String value){
                              userLoginModel.password = passwordController.text;
                            },
                            decoration: InputDecoration(
                                prefixIcon: Icon(Icons.lock),
                                suffixIcon: Icon(Icons.visibility),
                                labelText: 'Confirm password',
                                hintText: 'Confirm password',
                            )
                        ))),
                Padding(
                    padding: EdgeInsets.all(_minimumPadding*3),
                        child:TextFormField(
                            controller: emailController,
                            style:textStyle,
                            validator: (String value){
                              if(value.isEmpty)
                              {
                                return 'Please Enter E-mail address';
                              }
                              if(!RegExp("^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+.[a-z]").hasMatch(value)){
                                return 'Please enter a valid Email';
                              }
                              return null;
                            },
                            onSaved: (String value){
                              userLoginModel.email_id = emailController.text;
                            },
                            decoration: InputDecoration(
                                 prefixIcon: Icon(Icons.mail),
                                labelText: 'Email',
                                hintText: 'Email',
                            )
                        )),
                Padding(
                    padding: EdgeInsets.all(_minimumPadding*3),
                            child:TextFormField(
                            controller: mobilenoController,
                            style:textStyle,
                            validator: (String value){
                              if(value.isEmpty)
                              {
                                return 'Please enter phone no.';
                              }
                              if(value.length<10)
                                {
                                  return 'Please enter a valid phone no.';
                                }
                              return null;
                            },
                            onSaved: (String value){
                              userLoginModel.mobile_num = mobilenoController.text;
                            },
                            decoration: InputDecoration(
                                prefixIcon: Icon(Icons.phone),
                                labelText: 'Mobile number',
                                hintText: 'Mobile number',
                            )
                        )),
                Padding(
                  padding: EdgeInsets.all(_minimumPadding*3),
                      child: TextFormField(
                      controller: addressController,
                      style:textStyle,
                        validator: (String value){
                        if(value.isEmpty)
                        {
                          return 'Please Enter Address';
                        }
                        return null;
                      },
                      onSaved: (String value){
                        userLoginModel.address = addressController.text;
                      },
                      decoration: InputDecoration(
                        prefixIcon: Icon(Icons.person),
                        labelText: 'Address',
                        hintText: 'Address',
                    )
                  ),
                ),
              GestureDetector(
                onTap: (){
        if(_formkey.currentState.validate())
        {
        print("successful");
        Navigator.push(context,
            MaterialPageRoute(builder: (context) => AddPerson()));
    
        return;
        }else{
        print("UnSuccessfull");
        }
    },
                  child: GestureDetector(
                    onTap: () {
                      _save();
                      Navigator.push(context,
                          MaterialPageRoute(builder: (context) => UserLogin()));
                    },
                    child: Center(
                      child: Container(
                          padding:
                          EdgeInsets.symmetric(horizontal: 26, vertical: 20),
                          child: Text(
                            "Register".toUpperCase(),
                          ),
                        ),
                    ),
                  ),
                  ),
        Padding(
        padding: EdgeInsets.all(_minimumPadding*3),
                    child: Row(
                      children: <Widget>[
                        Expanded(
                            child: Text("Already registered?",
                            )
                        ),
    
                        GestureDetector(
                          onTap: () {
                            Navigator.push(context,
                                MaterialPageRoute(builder: (context) => UserLogin()));
                          },
    
                          child:Center(
                            child: Container(
                              padding:
                              EdgeInsets.symmetric(horizontal: 26, vertical: 10),
                              child: Text(
                                "Login".toUpperCase(),
                               
                              ),
                            ),
                          ),
                        )
                      ],
                    )
        )
              ],
            )));
    
      }
      void _togglePasswordView(){
        
        setState(() {
          isHiddenPassword=!isHiddenPassword;
    
        });
      }
      void moveToLastScreen() {
        Navigator.pop(context, true);
      }
      void insertuser() {
        userLoginModel.first_name = firstnameController.text;
      }
      void insertpassword() {
        userLoginModel.password = passwordController.text;
      }
      void _save() async {
        LoginCtr con = new LoginCtr();
        moveToLastScreen();
        int result;
        if (userLoginModel.user_id != null) {  // Case 1: Update operation
          //result = await helper.updateUser(note);
        } else { // Case 2: Insert Operation
          result = await con.saveUser(userLoginModel);
        }
    
        if (result != 0) {  // Success
          _showAlertDialog('Status', 'Note Saved Successfully');
        } else {  // Failure
          _showAlertDialog('Status', 'Problem Saving Note');
        }
      }
      void _showAlertDialog(String title, String message) {
        AlertDialog alertDialog = AlertDialog(
          title: Text(title),
          content: Text(message),
        );
        showDialog(
            context: context,
            builder: (_) => alertDialog
        );
      }
    
    }
import'包:customer/models/UserLoginModel.dart';
导入“包:客户/屏幕/添加_person.dart”;
导入“package:customer/utils/db_helper.dart”;
进口“包装:颤振/材料.省道”;
导入“package:customer/screens/UserLogin.dart”;
导入“包:客户/utils/Login_ctr.dart”;
类UserRegistration扩展了StatefulWidget{
最终用户登录模型用户登录模型;
//constUserRegistration({Key-Key,this.userLoginModel}):super(Key:Key);
用户注册(this.userLoginModel);
@凌驾
状态createState(){
返回UserRegistrationState();
}
}
类UserRegistrationState扩展状态{
DatabaseHelper=DatabaseHelper();
UserLoginModel UserLoginModel;
var _minimumPadding=5.0;
bool-isHiddenPassword=true;
最终的GlobalKey _formkey=GlobalKey();
TextEditingController firstnameController=TextEditingController();
TextEditingController lastnameController=TextEditingController();
TextEditingController密码控制器=TextEditingController();
TextEditingController cpasswordController=TextEditingController();
TextEditingController emailController=TextEditingController();
TextEditingController移动控制器=TextEditingController();
TextEditingController地址控制器=TextEditingController();
@凌驾
小部件构建(构建上下文){
TextStyle TextStyle=Theme.of(context).textTheme.title;
var height=MediaQuery.of(context).size.height;
var width=MediaQuery.of(context).size.width;
firstnameController.text=userLoginModel.firstName;
lastnameController.text=userLoginModel.lastName;
passwordController.text=userLoginModel.password;
emailController.text=userLoginModel.emailId;
MobileNodeController.text=userLoginModel.mobileNum;
addressController.text=userLoginModel.address;
返回脚手架(
背景颜色:Colors.white,
appBar:appBar(
标题:文本(“注册”),
正文:表格(
键:_formkey,
子:ListView(
儿童:[
文本(“Registration.toUpperCase(),),
填充物(
填充:边缘设置所有(_minimumPadding*3),
子项:TextFormField(
控制器:firstnameController,
风格:textStyle,
验证器:(字符串值){
if(value.isEmpty)
{
返回“请输入名字”;
}
返回null;
},
onChanged:(字符串值){
//名称=值;
插入器();
},
装饰:输入装饰(
前缀:图标(Icons.person),
labelText:“名字”,
hintText:'名字',
边框:大纲输入边框(
边界半径:边界半径。圆形(25.0),
),)
),
),
填充物(
填充:边缘设置所有(_minimumPadding*3),
子项:TextFormField(
控制器:lastnameController,
风格:textStyle,
验证器:(字符串值){
if(value.isEmpty)
{
返回“请输入姓氏”;
}
返回null;
},
onSaved:(字符串值){
userLoginModel.last_name=lastnameController.text;
},
装饰:输入装饰(
前缀:图标(Icons.person),
labelText:“姓氏”,
hintText:‘姓’,)
),
),
填充物(
填充:边缘设置所有(_minimumPadding*3),
子项:TextFormField(
控制器:密码控制器,
风格:textStyle,
验证器:(字符串值){
if(value.isEmpty)
{
返回“请输入密码”;
}
返回null;
},
模糊文字:isHiddenPassword,
装饰:输入装饰(
前缀:图标(Icons.lock),
墨水井(
onTap:\u切换PasswordView,
子:图标(Icons.visibility)),
labelText:“密码”,
hintText:'密码',
class UserLoginModel {
      int _user_id;
      String _firstName,_lastName,_mobileNum,_emailId,_address,_userType;
      String _password;
    
      UserLoginModel(this._firstName,this._lastName,this._mobileNum,this._emailId,this._address,this._password,this._userType);
    
      UserLoginModel.fromMap(dynamic obj) {
        this._user_id=obj['user_id'];
        this._firstName = obj['first_name'];
        this._lastName = obj['last_name'];
        this._emailId = obj['email_id'];
        this._mobileNum = obj['mobile_num'];
        this._address = obj['address'];
        this._password = obj['password'];
        this._userType = obj['user_type'];
      }
    
      int get user_id => _user_id;
      String get user_type => _userType;
    
      String get firstName => null;
    
      String get lastName => null;
    
      String get password => null;
    
      String get emailId => null;
    
      String get mobileNum => null;
    
      String get address => null;
    
      set first_name(String fname) {
          this._firstName = fname;
      }
    
      set last_name(String lname) {
        this._lastName = lname;
      }
      set email_id(String email) {
        this._emailId = email;
      }
    
      set mobile_num(String mob) {
        this._mobileNum = mob;
      }
      set address(String add) {
        this._address = add;
      }
    
      set password(String pwd) {
        this._password = pwd;
      }
    
      Map<String, dynamic> toMap() {
        var map = new Map<String, dynamic>();
        if (user_id != null) {
          map['user_id'] = user_id;
        }
        map["first_name"] = _firstName;
        map["last_name"] = _lastName;
        map["email_id"] = _emailId;
        map["mobile_num"] = _mobileNum;
        map["address"] = _address;
        map["password"] = _password;
        map["user_type"] = _userType;
        return map;
      }
    }
import 'dart:ui';
import 'package:customer/models/UserLoginModel.dart';
import 'package:customer/utils/Login_ctr.dart';
import 'package:customer/utils/db_helper.dart';
import 'package:customer/utils/login_response.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sqflite/sqflite.dart';
import 'Add_people.dart';
import 'UserRegistration.dart';
import 'people_list.dart';
import 'package:flutter/material.dart';
import 'ForgotPassword.dart';

class UserLogin extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {

    return UserLoginState();
  }
}
enum LoginStatus { notSignIn, signIn }

class UserLoginState extends State<UserLogin> implements LoginCallBack {
  DatabaseHelper databaseHelper = DatabaseHelper();
  String name,_password,_email_id;
  var _formKey=GlobalKey<FormState>();
  var _minimumPadding = 5.0;
  TextEditingController usernameController=TextEditingController();
  TextEditingController passwordController=TextEditingController();
  bool isHiddenPassword=true;

  LoginStatus _loginStatus = LoginStatus.notSignIn;
  BuildContext _ctx;
  bool _isLoading = false;
  final scaffoldKey = new GlobalKey<ScaffoldState>();
  LoginResponse _response;

  UserLoginState() {
    _response = new LoginResponse(this);
  }

  void _submit() {
    final form = _formKey.currentState;

    if (form.validate()) {
      setState(() {
        _isLoading = true;
        form.save();
        _response.doLogin(_email_id, _password);
      });
    }
  }


  void _showSnackBar(String text) {
    scaffoldKey.currentState.showSnackBar(new SnackBar(
      content: new Text(text),
    ));
  }

  var value;
  getPref() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    setState(() {
      value = preferences.getInt("value");

      _loginStatus = value == 1 ? LoginStatus.signIn : LoginStatus.notSignIn;
    });
  }

  signOut() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    setState(() {
      preferences.setInt("value", null);
      preferences.commit();
      _loginStatus = LoginStatus.notSignIn;
    });
  }

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


  void _togglePasswordView() {
    setState(() {
      isHiddenPassword = !isHiddenPassword;
    });
  }
  @override
  Widget build(BuildContext context) {
    TextStyle textStyle = Theme.of(context).textTheme.title;
    var height = MediaQuery.of(context).size.height;
    var width = MediaQuery.of(context).size.width;
    switch (_loginStatus) {
      case LoginStatus.notSignIn:
        _ctx = context;
        return Scaffold(
          backgroundColor: Colors.white,
          appBar: AppBar(
            title: Text('Customer Tracking System'),),
          body:
          Form(
            key: _formKey,
            child: Container(
              child: Padding(
                  padding: EdgeInsets.all(_minimumPadding * 2),
                  child: ListView
                    (
                    children: <Widget>[
                      Text("Login".toUpperCase(),),
                      Padding(
                          padding: EdgeInsets.only(
                              top: _minimumPadding * 3,
                              bottom: _minimumPadding),
                          child: TextFormField(
                              controller: usernameController,
                              style: textStyle,
                              validator: (String value) {
                                if (value.isEmpty) {
                                  return 'Please Enter Name';
                                }
                                return null;
                              },
                              onSaved: (String value) {
                                _email_id = value;
                              },
                              decoration: InputDecoration(
                                  prefixIcon: Icon(Icons.person),
                                  labelText: 'Username',
                                  hintText: 'Username',
                              )
                          )),
                      Padding(
                          padding: EdgeInsets.only(
                              top: _minimumPadding * 3,
                              bottom: _minimumPadding),

                          child: TextFormField(
                              style: textStyle,
                              obscureText: isHiddenPassword,
                              controller: passwordController,
                              validator: (String value) {
                                if (value.isEmpty) {
                                  return 'Please Enter Name';
                                }
                                return null;
                              },
                              onSaved: (String value) {
                                _password = value;
                              },
                              decoration: InputDecoration(
                                  prefixIcon: Icon(Icons.lock),
                                  suffixIcon: InkWell(
                                      onTap: _togglePasswordView,
                                      child: Icon(Icons.visibility)),
                                  labelText: 'Password',
                                  hintText: 'Password',
                              )
                          )
                      ), InkWell(
                        onTap: () {
                          Navigator.push(
                              context,
                              MaterialPageRoute(
                                  builder: (context) => ForgotPassword()));
                        },
                        child: Text(
                          "Forgot Password ?",
                        ),
                      ),
                      GestureDetector(
                        onTap: () {
                          _submit();
                        },
                        child: Container(
                          padding:
                          EdgeInsets.symmetric(horizontal: 26, vertical: 20),
                          child: Text(
                            "Login".toUpperCase(),
                          ),
                        ),
                      ),
                      Padding(
                          padding: EdgeInsets.only(
                              top: _minimumPadding * 2,
                              bottom: _minimumPadding),
                          child: Row(
                            children: <Widget>[
                              Expanded(
                                  child: Text("Not yet registered?",
                              ),
                              GestureDetector(
                                onTap: () {
                                  navigateToRegistration(UserLoginModel('','','','','','','')); 
                                },
                                child: Center(
                                  child: Container(
                                    padding:
                                    EdgeInsets.symmetric(
                                        horizontal: 26, vertical: 10),
                                    child: Text(
                                      "Register".toUpperCase(),
                                    ),
                                  ),
                                ),
                              )
                            ],
                          )
                      ),
                    ],
                  )),
            ),
          ),

        );
        break;
      case LoginStatus.signIn:
        //return People_List(signOut);
        Navigator.push(context,
            MaterialPageRoute(builder: (context) =>
                People_List()));
        break;
    }
  }
  savePref(int value,String user, String pass) async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    setState(() {
      preferences.setInt("value", value);
      preferences.setString("user", user);
      preferences.setString("pass", pass);
      preferences.commit();
    });
  }

  @override
  void onLoginError(String error) {
    _showSnackBar(error);
    setState(() {
      _isLoading = false;
    });
  }

  @override
  void onLoginSuccess(UserLoginModel user) async {
    if(user != null){
      savePref(1,user.emailId, user.password);
      _loginStatus = LoginStatus.signIn;
    }else{
      _showSnackBar("Dont know");
      setState(() {
        _isLoading = false;
      });
    }
 }
  void navigateToRegistration(UserLoginModel userLoginModel) async{
      bool result = await Navigator.push(context, MaterialPageRoute(builder: (context) {
        return UserRegistration(userLoginModel);
      }));
 }
}
firstnameController.text = userLoginModel.firstName; // userLoginModel is null so userLoginModel.firstName doesn't exist
lastnameController.text = userLoginModel.lastName;
passwordController.text = userLoginModel.password;
...