Can't save vehicle info to firebase [VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: Invalid argument: Instance of 'TextEditingController'

Viewed 368

I am taking a Udemy course on building an Uber app. I have created a dart file called VehicleInfo.dart which can be seen below. For some reason none of my Vehicle Info is saving to firebase. If anyone could help/point out where I may be making a mistake I would really appreciate it. Thank you in advance :) below this code is my signuppage.dart file as well. After the user signs up, they are then taken to the vehicle info page. Below that is the unhandled exception error I am getting as well.

vehicleinfo.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:cab_driver/BrandColors.dart';
import 'package:cab_driver/globalvariables.dart';
import 'package:cab_driver/screens/mainpage.dart';
import 'package:cab_driver/widgets/BrandButton.dart';

class VehicleInfo extends StatelessWidget {

  final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
  final FirebaseAuth _auth = FirebaseAuth.instance;
  void showSnackBar(title, context) {
    final SnackBar snackBar = SnackBar(
      content: Text(
        title,
        textAlign: TextAlign.center,
        style: TextStyle(fontSize: 15),
      ),
    );
    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  }

  static const String id = 'vehicleinfo';

  var vehicleMakeController = TextEditingController();
  var vehicleModelController = TextEditingController();
  var vehicleColorController = TextEditingController();
  var vehicleLicensePlateController = TextEditingController();
  var driverLicenseIDNumberController = TextEditingController();

  void updateProfile(context){
    String id = currentFirebaseUser.uid;
    DatabaseReference driverRef = FirebaseDatabase.instance.reference().child('drivers/$id/Vehicle_Details');

    Map map = {
      'Vehicle Make': vehicleMakeController.text,
      'Vehicle Model': vehicleModelController,
      'Vehicle Color': vehicleColorController,
      'Vehicle License Plate': vehicleLicensePlateController,
      'Driver License ID Number': driverLicenseIDNumberController,
    };

    driverRef.set(map);

    Navigator.pushNamedAndRemoveUntil(context, MainPage.id, (route) => false);
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: scaffoldKey,
      body: SafeArea(
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              SizedBox(height: 20,),

              Image.asset('./images/Sign_In_Logo.png', height: 110, width: 110,),
              
              Padding(
                padding: EdgeInsets.fromLTRB(20,20,20,30),
                child: Column(
                  children: <Widget>[

                    SizedBox(height: 10,),

                    Text('Enter Vehicle Details',style: TextStyle(fontFamily: 'Montserrat', fontSize: 22),),

                    SizedBox(height: 25,),

                    // Vehicle Make
                    TextFormField(
                      controller: vehicleMakeController,
                      keyboardType: TextInputType.text,
                      decoration: InputDecoration(
                        labelText: 'Vehicle Make',
                        hintStyle: TextStyle(
                          color: Colors.grey,
                          fontSize: 14.0,
                          fontFamily: 'Montserrat',
                        )
                      ),
                      style: TextStyle(fontSize: 14.0),
                    ),

                    SizedBox(height: 10,),

                    // Vehicle Model
                    TextFormField(
                      controller: vehicleModelController,
                      keyboardType: TextInputType.text,
                      decoration: InputDecoration(
                          labelText: 'Vehicle Model',
                          hintStyle: TextStyle(
                            color: Colors.grey,
                            fontSize: 14.0,
                            fontFamily: 'Montserrat',
                          )
                      ),
                      style: TextStyle(fontSize: 14.0),
                    ),

                    SizedBox(height: 10,),

                    // Vehicle Color
                    TextFormField(
                      controller: vehicleColorController,
                      decoration: InputDecoration(
                          labelText: 'Vehicle Color',
                          hintStyle: TextStyle(
                            color: Colors.grey,
                            fontSize: 14.0,
                            fontFamily: 'Montserrat',
                          )
                      ),
                      style: TextStyle(fontSize: 14.0),
                    ),

                    SizedBox(height: 10,),

                    // Vehicle License Plate Number
                    TextFormField(
                      controller: vehicleLicensePlateController,
                      maxLength: 11,
                      decoration: InputDecoration(
                          counterText: '',
                          labelText: 'Vehicle License Plate',
                          hintStyle: TextStyle(
                            color: Colors.grey,
                            fontSize: 14.0,
                            fontFamily: 'Montserrat',
                          )
                      ),
                      style: TextStyle(fontSize: 14.0),
                    ),

                    SizedBox(height: 10,),

                    // Driver License ID Number
                    TextFormField(
                      controller: driverLicenseIDNumberController,
                      //keyboardType: TextInputType.text,
                      decoration: InputDecoration(
                          labelText: 'Driver License ID Number',
                          hintStyle: TextStyle(
                            color: Colors.grey,
                            fontSize: 14.0,
                            fontFamily: 'Montserrat',
                          )
                      ),
                      style: TextStyle(fontSize: 14.0),
                    ),

                    SizedBox(height: 40,),

                    BrandButton(
                      color: BrandColors.colorPrimary,
                      title: 'Register Vehicle',
                      onPressed: (){
                        if(vehicleMakeController.text.length < 3){
                          showSnackBar('Please provide a valid vehicle make', context);
                          return;
                        }

                        if(vehicleModelController.text.length < 2){
                          showSnackBar('Please provide a valid vehicle model', context);
                          return;
                        }

                        if(vehicleColorController.text.length < 3){
                          showSnackBar('Please provide a valid vehicle model', context);
                          return;
                        }

                        if(vehicleLicensePlateController.text.length < 5){
                          showSnackBar('Please provide a valid license plate', context);
                          return;
                        }

                        if(driverLicenseIDNumberController.text.length <9){
                          showSnackBar('Please provide a valid driver id number', context);
                          return;
                        }

                        updateProfile(context);


                      },
                    )
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

signuppage.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:connectivity/connectivity.dart';
import 'package:cab_driver/BrandColors.dart';
import 'package:cab_driver/globalvariables.dart';
import 'package:cab_driver/screens/loginpage.dart';
import 'package:cab_driver/screens/mainpage.dart';
import 'package:cab_driver/screens/vehicleinfo.dart';
import 'package:cab_driver/widgets/ProgressDialog.dart';
import 'package:cab_driver/widgets/SkapeButton.dart';
import 'package:cab_driver/widgets/showsnackbar.dart';

class SignUpPage extends StatefulWidget {

  static const String id = 'signup';

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

class _SignUpPageState extends State<SignUpPage> {
  final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
  final FirebaseAuth _auth = FirebaseAuth.instance;
  var _fullNameController = TextEditingController();
  var _emailController = TextEditingController();
  var _phoneNumberController = TextEditingController();
  var _passwordController = TextEditingController();
  var _confirmPasswordController = TextEditingController();

  void signUpUser() async {

    String authErrMsg;

    // Show Please Wait Dialog
    showDialog(
      barrierDismissible: false,
      context: context,
      builder: (BuildContext context) => ProgressDialog(status: 'Signing you in...',),
    );

    try {
      //final
      User newUser = (await _auth.createUserWithEmailAndPassword(
        email: _emailController.text,
        password: _passwordController.text,
      )).user;

      // Check if user registration success
      print('The new user:\n$newUser');
      Navigator.pop(context);
      if(newUser != null){
        showSnackBar('Registration Successful!', context);
        print('Registration Successful!');

        DatabaseReference newUserRef =
        FirebaseDatabase.instance.reference().child('drivers/${newUser.uid}');

        // Prepare data to be saved on users table
        Map userMap = {
          'fullname': _fullNameController.text,
          'email': _emailController.text,
          'password': _passwordController.text,
          'cellphone': _phoneNumberController.text,
        };

        newUserRef.set(userMap);

        currentFirebaseUser = newUser;

        // Take user to main page
        Navigator.pushNamed(context, VehicleInfo.id);
      }

    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        authErrMsg = 'The password provided is too weak';
        print(authErrMsg);
        showSnackBar(authErrMsg, context);
      } else if (e.code == 'email-already-in-use') {
        authErrMsg = 'An account already exists for that email';
        print(authErrMsg);
        showSnackBar(authErrMsg, context);
      } else if (e.code == 'invalid-email') {
        authErrMsg = 'Email address is invalid';
        print(authErrMsg);
        showSnackBar(authErrMsg, context);
      }
    } catch (e) {
      print(e);
      showSnackBar(e, context);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.white,
        body: SafeArea(
          child: SingleChildScrollView(
            child: Padding(
              padding: EdgeInsets.all(3.0),
              child: Column(
                  children: <Widget>[
                    Row(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        BackButton(
                          onPressed: (){
                            Navigator.pushNamedAndRemoveUntil(context, MainPage.id, (route) => false);
                          },
                        ),
                      ],
                    ),
                    SizedBox(height: 10,),
                    Image(
                      alignment: Alignment.center,
                      height: 150.0,
                      width: 150.0,
                      image: AssetImage('./images/Sign_In_Logo.png'),
                    ),

                    SizedBox(height: 5,),

                    Text('Landscaper Sign Up',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                          fontSize: 25, fontFamily: 'Montserrat'),
                    ),

                    Padding(
                      padding: EdgeInsets.all(12.0),
                      child: Column(
                        children: <Widget>[

                          // Full Name
                          TextFormField(
                            controller: _fullNameController,
                            keyboardType: TextInputType.text,
                            decoration: InputDecoration(
                                prefixIcon: Icon(Icons.person_outline),
                                labelText: 'Full Name',
                                labelStyle: TextStyle(
                                  fontSize: 14.0,
                                  fontFamily: 'Montserrat',
                                ),
                                hintStyle: TextStyle(
                                  color: Colors.grey,
                                  fontSize: 12.0,
                                  fontFamily: 'Montserrat',
                                )
                            ),
                            style: TextStyle(fontSize: 14),
                          ),

                          SizedBox(height: 10,),

                          // Email Address
                          TextFormField(
                            controller: _emailController,
                            keyboardType: TextInputType.emailAddress,
                            decoration: InputDecoration(
                                labelText: 'Email Address',
                                prefixIcon: Icon(Icons.email_outlined),
                                labelStyle: TextStyle(
                                  fontSize: 14.0,
                                  fontFamily: 'Montserrat',
                                ),
                                hintStyle: TextStyle(
                                  color: Colors.grey,
                                  fontSize: 12.0,
                                  fontFamily: 'Montserrat',
                                )
                            ),
                            style: TextStyle(fontSize: 14),
                          ),

                          SizedBox(height: 10,),

                          // Phone Number
                          TextFormField(
                            controller: _phoneNumberController,
                            keyboardType: TextInputType.phone,
                            decoration: InputDecoration(
                                labelText: 'Phone Number',
                                prefixIcon: Icon(Icons.local_phone_outlined),
                                labelStyle: TextStyle(
                                  fontSize: 14.0,
                                  fontFamily: 'Montserrat',
                                ),
                                hintStyle: TextStyle(
                                  color: Colors.grey,
                                  fontSize: 12.0,
                                  fontFamily: 'Montserrat',
                                )
                            ),
                            style: TextStyle(fontSize: 14),
                          ),

                          SizedBox(height: 10,),

                          // Password
                          TextFormField(
                            controller: _passwordController,
                            obscureText: true,
                            decoration: InputDecoration(
                                labelText: 'Password',
                                prefixIcon: Icon(Icons.lock_outline),
                                labelStyle: TextStyle(
                                  fontSize: 14.0,
                                  fontFamily: 'Montserrat',
                                ),
                                hintStyle: TextStyle(
                                  color: Colors.grey,
                                  fontSize: 12.0,
                                  fontFamily: 'Montserrat',
                                )
                            ),
                            style: TextStyle(fontSize: 14),
                          ),

                          SizedBox(height: 10,),

                          // Confirm Password
                          TextFormField(
                            controller: _confirmPasswordController,
                            obscureText: true,
                            decoration: InputDecoration(
                                labelText: 'Confirm Password',
                                prefixIcon: Icon(Icons.lock_open),
                                labelStyle: TextStyle(
                                  fontSize: 14.0,
                                  fontFamily: 'Montserrat',
                                ),
                                hintStyle: TextStyle(
                                  color: Colors.grey,
                                  fontSize: 12.0,
                                  fontFamily: 'Montserrat',
                                )
                            ),
                            style: TextStyle(fontSize: 14),
                          ),

                          SizedBox(height: 20,),

                          BrandButton(
                            title: 'SIGN UP',
                            color: BrandColors.colorPrimary,
                            onPressed: () async {

                              String authErrMsg;

                              var connectivityResult = await Connectivity().checkConnectivity();
                              if(connectivityResult != ConnectivityResult.mobile && connectivityResult != ConnectivityResult.wifi){
                                authErrMsg = 'No Internet Connection';
                                print(authErrMsg);
                                showSnackBar(authErrMsg, context);
                              }
                              if (_passwordController.text != _confirmPasswordController.text) {
                                authErrMsg = 'Passwords Do Not Match';
                                print(authErrMsg);
                                showSnackBar(authErrMsg, context);
                              } else if (_fullNameController.text.length < 3){
                                authErrMsg = 'Please Provide A Valid Full Name';
                                print(authErrMsg);
                                showSnackBar(authErrMsg, context);
                              } else if (_phoneNumberController.text.length < 10){
                                authErrMsg = 'Please Provide A Valid Phone Number';
                                print(authErrMsg);
                                showSnackBar(authErrMsg, context);
                              } else {
                                signUpUser();
                              }
                              // signUpUser();
                            },
                          )
                        ],
                      ),
                    ),

                    TextButton(
                      onPressed: () {
                        Navigator.pushNamedAndRemoveUntil(context, LoginPage.id, (route) => false);
                      },
                      child: Text.rich(
                        TextSpan(
                          text: 'Already a Driver? ',
                          style: TextStyle(
                            fontSize: 18,
                            color: Color(0xFF96A13A),
                            fontFamily: 'Montserrat',),
                          children: <TextSpan>[
                            TextSpan(
                                text: 'Log in',
                                style: TextStyle(
                                    fontSize: 18,
                                    color: Color(0xFF96A13A),
                                    fontFamily: 'Montserrat',
                                    decoration: TextDecoration.underline
                                )),
                          ],
                        ),
                      ),
                    ),
                  ]
              ),
            ),
          ),
        )
    );
  }
}

Unhandled Exception:

    flutter: Registration Successful!
[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: Invalid argument: Instance of 'TextEditingController'
#0      StandardMessageCodec.writeValue (package:flutter/src/services/message_codecs.dart:403:7)
#1      StandardMessageCodec.writeValue.<anonymous closure> (package:flutter/src/services/message_codecs.dart:400:9)
#2      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:397:8)
#3      StandardMessageCodec.writeValue (package:flutter/src/services/message_codecs.dart:398:13)
#4      StandardMessageCodec.writeValue.<anonymous closure> (package:flutter/src/services/message_codecs.dart:400:9)
#5      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:397:8)
#6      StandardMessageCodec.writeValue (package:flutter/src/services/message_codecs.dart:398:13)
#7      StandardMethodCodec.encodeMethodCall (package:flutter/src/services/message_codecs.dart:535:18)
#8      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:150:13)
#9      Meth<…>
1 Answers

The error is in the code block below:

    Map map = {
          'Vehicle Make': vehicleMakeController.text,
          'Vehicle Model': vehicleModelController,
          'Vehicle Color': vehicleColorController,
          'Vehicle License Plate': vehicleLicensePlateController,
          'Driver License ID Number': driverLicenseIDNumberController,
    };

You're passing the TextEditingController instance for vehicle model, vehicle color, vehicle license plate and driver license id number.

You need to use the .text getter to get the actual string from the controllers. Also, specifying the Map types will help you identify the errors next time.

Update the definition for map above to the one below and it should fix the error:

    Map<String, String> map = {
          'Vehicle Make': vehicleMakeController.text,
          'Vehicle Model': vehicleModelController.text,
          'Vehicle Color': vehicleColorController.text,
          'Vehicle License Plate': vehicleLicensePlateController.text,
          'Driver License ID Number': driverLicenseIDNumberController.text,
    };
Related