Xiris
Xiris

Reputation: 7

The instance member 'firstName' can't be accessed in an initializer

I'm trying to give default value to a TextFormField using text: parameter in it's controller

class _EditProfileState extends State<EditProfile> {

  String firstName = "Sushant";

  TextEditingController firstNameController = TextEditingController(text: firstName);

But am getting the following error

The instance member 'firstName' can't be accessed in an initializer.
Try replacing the reference to the instance member with a different expression

Upvotes: 1

Views: 836

Answers (3)

Zakaria Hossain
Zakaria Hossain

Reputation: 2504

Try to use late with TextEditingController then initialize TextEditingController inside initState.

class _EditProfileState extends State<EditProfile> {

  String firstName = "Sushant";
  late TextEditingController firstNameController;

  @override
  void initState() {
    firstNameController = TextEditingController(text: firstName);
  }
}

@override
void dispose() {
  firstNameController.dispose();
  super.dispose();
}

Or use

class _EditProfileState extends State<EditProfile> {
        
    String firstName = "Sushant";
    TextEditingController firstNameController = TextEditingController();
        
    @override
    void initState() {
       firstNameController.text = firstName;
    }
}

@override
void dispose() {
   firstNameController.dispose();
   super.dispose();
}

Upvotes: 1

TYJ
TYJ

Reputation: 548

Since you are using State, set default text in initState.

This will only trigger once when Widget is initialized. Also set all TextEditingController as final, you should not assign new one later.

Last, remember to dispose it.

String firstName = "Sushant";
final TextEditingController firstNameController = TextEditingController();

@override
void initState() {
  firstNameController.text = firstName;
  super.initState();
}

@override
void dispose() {
  firstNameController.dispose();
  super.dispose();
}

Upvotes: 0

Valentin Vignal
Valentin Vignal

Reputation: 8202

Here you are trying to initiate firstNameController with a non-constant value. firstName here is not static and belongs to the instance. When the class is created, it cannot access properties of itself because they are not created either (nothing guarantees that firstName is created before firstNameController).

However, you can use the late keyword:

class _EditProfileState extends State<EditProfile> {

  String firstName = "Sushant";

  late TextEditingController firstNameController = TextEditingController(text: firstName);
}

late will make firstNameController "lazy". It means it is only going to be evaluated when called (and not when your class instance is created). Therefore, when using the late keyword, when evaluated, your class is already created with its properties and you can access them.

Upvotes: 0

Related Questions