how to access variables from other widgets

969 Views Asked by At

hello I would like to know how to access variables from other widgets. for example: I would like that when I touch the button of the widget BotonLogin, it prints the user variable of the widget CamposUsuario.

  class CamposUsuario extends StatelessWidget {
  final String texto;
  CamposUsuario({required this.texto});
  final usuario = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      decoration: InputDecoration(
          labelStyle: TextStyle(fontSize: 20), labelText: "$texto"),
      obscureText: (this.texto == "Password") ? true : false,
      controller: usuario,
    );
  }
}

class BotonLogin extends StatelessWidget {
  const BotonLogin({
    Key? key,
  }) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      padding: EdgeInsets.symmetric(horizontal: 60),
      elevation: 7,
      onPressed: () {
        print('si');
      },
      color: Colors.amber[900],
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
      child: Text("Login"),
    );
  }
}
2

There are 2 best solutions below

4
rickimaru On BEST ANSWER

You can just pass an onPressed callback to your BotonLogin and pass a controller to your CamposUsuario. Then the parent widget will use the passed TextEditingController to get the value of CamposeUsuario.

Sample...

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final TextEditingController usernameController = TextEditingController();
    // UPDATE
    final TextEditingController passwordController = TextEditingController();

    return Scaffold(
      body: Column(
        children: <Widget>[
          CamposUsuario(
            texto: 'Username',
            usuario: usernameController,
          ),
          // UPDATE
          CamposUsuario(
            texto: 'Password',
            usuario: passwordController,
          ),
          BotonLogin(
            onPressed: () {
              print('Si ${usernameController.text}');
              // UPDATE
              print('Password: ${passwordController.text}');
            },
          ),
        ],
      ),
    );
  }
}

class CamposUsuario extends StatelessWidget {
  CamposUsuario({
    required this.texto,
    required this.usuario,
    Key? key,
  }) : super(key: key);

  final String texto;
  final TextEditingController usuario;

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      decoration: InputDecoration(
        labelStyle: const TextStyle(fontSize: 20),
        labelText: texto,
      ),
      obscureText: (this.texto == "Password") ? true : false,
      controller: usuario,
    );
  }
}

class BotonLogin extends StatelessWidget {
  BotonLogin({
    required this.onPressed,
    Key? key,
  }) : super(key: key);

  final VoidCallback onPressed;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text("Login"),
    );
  }
}
0
Abu Anwar On

If you want to solve your problem then you need State management.

Check the office doc for a list of state management approaches

https://flutter.dev/docs/development/data-and-backend/state-mgmt/options