1
resposta

Acessando variável em outra classe

Olá! Eu estou fazendo algumas mudanças no projeto por conta própria para aprender mais e me deparei com um problema, estou tentanto fazer um Text() aparecer/desaparecer quando eu clico em um TextField(), no entanto, no curso fizemos o TextField() em um classe separada e a variável (essa variável é um bool que vai fazer a mudança que eu quero, aparecer/desaparecer) está em outra classe! Eu procurei bastante e nao achei uma resposta pro meu problema! Eu até pensei em mudar alguns Widgets para Stateful e tentar usar widget.nomeDaVariável mas como eu nao tenho tanto conhecimento preferi nao mexer! Alguém consegue me ajudar?

Segue o código:

Classe onde está localizada a variável que eu preciso mudar:

class FormularioTransferenciaState extends State<FormularioTransferencia> {
  final TextEditingController _accNumberController = TextEditingController();
  final TextEditingController _valueController = TextEditingController();
  bool _incorrectForm = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Criar transferencia'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            TextEditor(
              myController: _accNumberController,
              myLabel: 'Acc. number',
              myHint: '0000',
              myIcon: Icons.account_circle,
            ),
            TextEditor(
              myController: _valueController,
              myLabel: 'Value',
              myHint: '0.00',
              myIcon: Icons.monetization_on,
            ),
            ConstrainedBox(
              constraints: BoxConstraints.tightFor(width: 120, height: 60),
              child: ElevatedButton(
                onPressed: () => criarTransferencia(context),
                child: Text('CONFIRMAR'),
                style: ButtonStyle(
                    textStyle:
                        MaterialStateProperty.all(TextStyle(fontSize: 16.0))),
              ),
            ),
            if (_incorrectForm)
              Padding(
                padding: EdgeInsets.only(top: 10),
                child: Text(
                  "Something is missing...",
                  style: TextStyle(
                    fontWeight: FontWeight.bold,
                    color: Colors.red,
                    fontSize: 15,
                  ),
                ),
              )
          ],
        ),
      ),
    );
  }

  void criarTransferencia(BuildContext context) {
    final int? accNumber = int.tryParse(_accNumberController.text);
    final double? value = double.tryParse(_valueController.text);

    if (accNumber != null && value != null) {
      final transferencia = Transferencia(value, accNumber);
      setState(() {
        _incorrectForm = false;
      });
      Navigator.pop(context, transferencia);
    } else {
      setState(() {
        _incorrectForm = true;
      });
    }
  }
}

Classe que tem o TextField():

class TextEditor extends StatelessWidget {
  final IconData? myIcon;
  final String myLabel;
  final String myHint;
  final TextEditingController myController;

  TextEditor({
    this.myIcon,
    required this.myLabel,
    required this.myHint,
    required this.myController,
  });

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(24.0),
      child: TextField(
        decoration: InputDecoration(
          icon: myIcon != null ? Icon(myIcon) : null,
          labelText: myLabel,
          hintText: myHint,
        ),
        style: TextStyle(
          fontSize: 24.0,
        ),
        keyboardType: TextInputType.number,
        controller: myController,
      ),
    );
  }
}
1 resposta

Fala Guilherme tudo tranquilo? já conseguiu solucionar? se não segue algumas observações

  • Primeiro que para fazer seu Text aparecer e desaparecer não vai ter como escapar do Stateful a não ser que usasse uma lib de gerencia de estado más aí é outra história para um tópico mais avançado, o Stateful é que vai ser capaz de redesenhar a tela apagando e não apagando seu Text
  • segundo que usar o TextField como botão para controlar alguma coisa não acho indicado, o TextField tem seu próprio listener, para gerenciar a entrada de caracteres

Te aconcelho a fazer um botão próprio seu pra sua funcionalidade e o próprio botão te retornar true or false, assim voce seta a variável da sua classe corrente e dá um setState pra tela se atualizar (lembrando que ai deveria estar como Stateful), vai continuando com os cursos que essas ideias vão ficar mais clara pra voce, abraço