我学习Flutter和我有一个问题,我不能解决它。我试图使一个计算器的基础上一些代码和这个错误出现
无法无条件调用方法“validate”,因为接收方可以为“null”。尝试使调用有条件(使用'?.')或向目标('!').
这是密码
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))
],
),
),
),
);
}
}
5条答案
按热度按时间rqqzpn5f1#
解释如下。
让我们考虑一下这一点适用行:
消息
无法无条件调用方法“validate”,因为接收方可以为“null”。尝试使调用有条件(使用'?.')或向目标('!').
这意味着在“validate”之前的属性,也就是“currentState”,在某些情况下可能为null(https://dart.dev/null-safety了解更多信息)。
在它实际为null的情况下,您不能调用“validate”方法,因为null没有“validate”方法。换句话说,自从做了这个
是一个不可行的方法,调用“validate”方法对一些东西是(或者只能是,如果你有null安全活动)null也是一个不可行的方法:dart试图告诉你必须处理null值的情况。在null-safety之前,你可以写这个,你可以在运行时找到这个例子。
事实上,在运行时“_formKey.currentState”可以是一个对象,但在某些特定情况下也可以是null。你必须决定如何处理它:你100%确定在这种情况下“_formKey.currentState”不能为null吗?还是你不确定?
此时,您有两个选择:
1.使用“null assertion operator”(!.):手动告诉编译器调用“validate”方法在这一点上是完全安全的,例如,因为你已经确定,即使变量在某些情况下理论上可以为null,你已经检查过它,并且特定情况是100%安全的。换句话说,它在代码的特定点永远不会为空。注意,如果你错了,它会在运行时抛出一个错误(Null check operator used on a null value)。
1.使用“null aware operator”(?.):您不确定在这种情况下currentState是否可以为null。你告诉你的编译器在引擎盖下写这个:
mfuanj7w2#
简单地加上'!在.validate()之前使用“”或“?”。因此,更改这一行:
收件人:
这是因为dart 2.0添加了null safety operators。您可以在此链接中阅读更多详细信息:https://dart.dev/null-safety
kfgdxczn3#
试试这样的方法:
jm81lzqq4#
尝试在validate()方法之前添加null安全性
rkttyhzu5#