【发布时间】:2023-04-10 16:45:01
【问题描述】:
我正在研究 Flutter,但我遇到了一个问题,我无法解决它。 我正在尝试根据一些代码制作计算器并出现此错误
方法 'validate' 不能被无条件调用,因为 接收者可以为“空”。尝试使呼叫有条件(使用'?.') 或向目标添加空检查 ('!')。
这是代码
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))
],
),
),
),
);
}
}
【问题讨论】: