Im study flutter and i have a problem and I can't solve it. I'm trying to make a calculator based on some codes and this error appears
The method 'validate' can't be unconditionally invoked because the receiver can be 'null'. Try making the call conditional (using '?.') or adding a null check to the target ('!').
this is the code
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(home: Home()));
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
TextEditingController pesoController = TextEditingController();
TextEditingController alturaController = TextEditingController();
String _info = "Informe seus dados";
GlobalKey<FormState> _formKey = GlobalKey<FormState>();
void _reset() {
setState(() {
pesoController.text = "";
alturaController.text = "";
_info = "Informe seus dados";
});
}
void _calculate() {
double peso = double.parse(pesoController.text);
double altura = double.parse(alturaController.text) / 100;
double imc = peso / (altura * altura);
setState(() {
if (imc < 18.6) {
_info = "Abaixo do Peso (${imc.toStringAsPrecision(2)})";
} else if (imc >= 18.6 && imc <= 24.9) {
_info = "Peso Ideal (${imc.toStringAsPrecision(2)})";
} else if (imc >= 24.9 && imc <= 29.9) {
_info = "Levemente acima do peso (${imc.toStringAsPrecision(2)})";
} else if (imc >= 24.9 && imc <= 34.9) {
_info = "Obesidade Grau I (${imc.toStringAsPrecision(2)})";
} else if (imc >= 34.9 && imc <= 39.9) {
_info = "Obesidade Grau II (${imc.toStringAsPrecision(2)})";
} else if (imc >= 40) {
_info = "Obesidade Grau III (${imc.toStringAsPrecision(2)})";
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Calculador IMC"),
centerTitle: true,
backgroundColor: Colors.deepPurple,
actions: <Widget>[
IconButton(
icon: Icon(Icons.refresh),
onPressed: _reset,
)
],
),
backgroundColor: Colors.white,
body: SingleChildScrollView(
padding: EdgeInsets.all(20),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Icon(Icons.person, size: 120, color: Colors.deepPurple),
TextFormField(
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: "Peso (KG)",
labelStyle: TextStyle(color: Colors.deepPurple)),
textAlign: TextAlign.center,
style: TextStyle(color: Colors.deepPurple, fontSize: 25),
controller: pesoController,
validator: (value) {
if (value!.isEmpty) {
return "Informe seu peso!";
}
},
),
TextFormField(
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: "Altura (CM)",
labelStyle: TextStyle(color: Colors.deepPurple)),
textAlign: TextAlign.center,
style: TextStyle(color: Colors.deepPurple, fontSize: 25),
controller: alturaController,
validator: (value) {
if (value!.isEmpty) {
return "Informe sua altura!";
}
},
),
Padding(
padding: EdgeInsets.fromLTRB(0.0, 15, 0.0, 15),
child: Container(
height: 50,
child: RaisedButton(
onPressed: () {
if (_formKey.currentState.validate()) {
_calculate();
}
},
child: Text(
"Calcular",
style: TextStyle(color: Colors.white, fontSize: 25),
),
color: Colors.deepPurple,
),
)),
Text(_info,
textAlign: TextAlign.center,
style: TextStyle(color: Colors.deepPurple, fontSize: 25))
],
),
),
),
);
}
}
CodePudding user response:
Try something like this:
validator: (value) {
if (value!.length < 1) return 'Empty field';
return null;
}
CodePudding user response:
Simply add '!' or '?' before .validate(). So change this line:
if (_formKey.currentState.validate()) {
to:
if (_formKey.currentState!.validate()) {
This is because of the null safety operators added to dart 2.0. You can read it more detailed in this link: https://dart.dev/null-safety