dart方法'validate'不能无条件调用,因为接收器可以是'null'

t98cgbkg  于 2023-09-28  发布在  其他
关注(0)|答案(5)|浏览(166)

我学习Flutter和我有一个问题,我不能解决它。我试图使一个计算器的基础上一些代码和这个错误出现
无法无条件调用方法“validate”,因为接收方可以为“null”。尝试使调用有条件(使用'?.')或向目标('!').
这是密码

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(MaterialApp(home: Home()));
  4. }
  5. class Home extends StatefulWidget {
  6. @override
  7. _HomeState createState() => _HomeState();
  8. }
  9. class _HomeState extends State<Home> {
  10. TextEditingController pesoController = TextEditingController();
  11. TextEditingController alturaController = TextEditingController();
  12. String _info = "Informe seus dados";
  13. GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  14. void _reset() {
  15. setState(() {
  16. pesoController.text = "";
  17. alturaController.text = "";
  18. _info = "Informe seus dados";
  19. });
  20. }
  21. void _calculate() {
  22. double peso = double.parse(pesoController.text);
  23. double altura = double.parse(alturaController.text) / 100;
  24. double imc = peso / (altura * altura);
  25. setState(() {
  26. if (imc < 18.6) {
  27. _info = "Abaixo do Peso (${imc.toStringAsPrecision(2)})";
  28. } else if (imc >= 18.6 && imc <= 24.9) {
  29. _info = "Peso Ideal (${imc.toStringAsPrecision(2)})";
  30. } else if (imc >= 24.9 && imc <= 29.9) {
  31. _info = "Levemente acima do peso (${imc.toStringAsPrecision(2)})";
  32. } else if (imc >= 24.9 && imc <= 34.9) {
  33. _info = "Obesidade Grau I (${imc.toStringAsPrecision(2)})";
  34. } else if (imc >= 34.9 && imc <= 39.9) {
  35. _info = "Obesidade Grau II (${imc.toStringAsPrecision(2)})";
  36. } else if (imc >= 40) {
  37. _info = "Obesidade Grau III (${imc.toStringAsPrecision(2)})";
  38. }
  39. });
  40. }
  41. @override
  42. Widget build(BuildContext context) {
  43. return Scaffold(
  44. appBar: AppBar(
  45. title: Text("Calculador IMC"),
  46. centerTitle: true,
  47. backgroundColor: Colors.deepPurple,
  48. actions: <Widget>[
  49. IconButton(
  50. icon: Icon(Icons.refresh),
  51. onPressed: _reset,
  52. )
  53. ],
  54. ),
  55. backgroundColor: Colors.white,
  56. body: SingleChildScrollView(
  57. padding: EdgeInsets.all(20),
  58. child: Form(
  59. key: _formKey,
  60. child: Column(
  61. crossAxisAlignment: CrossAxisAlignment.stretch,
  62. children: <Widget>[
  63. Icon(Icons.person, size: 120, color: Colors.deepPurple),
  64. TextFormField(
  65. keyboardType: TextInputType.number,
  66. decoration: InputDecoration(
  67. labelText: "Peso (KG)",
  68. labelStyle: TextStyle(color: Colors.deepPurple)),
  69. textAlign: TextAlign.center,
  70. style: TextStyle(color: Colors.deepPurple, fontSize: 25),
  71. controller: pesoController,
  72. validator: (value) {
  73. if (value!.isEmpty) {
  74. return "Informe seu peso!";
  75. }
  76. },
  77. ),
  78. TextFormField(
  79. keyboardType: TextInputType.number,
  80. decoration: InputDecoration(
  81. labelText: "Altura (CM)",
  82. labelStyle: TextStyle(color: Colors.deepPurple)),
  83. textAlign: TextAlign.center,
  84. style: TextStyle(color: Colors.deepPurple, fontSize: 25),
  85. controller: alturaController,
  86. validator: (value) {
  87. if (value!.isEmpty) {
  88. return "Informe sua altura!";
  89. }
  90. },
  91. ),
  92. Padding(
  93. padding: EdgeInsets.fromLTRB(0.0, 15, 0.0, 15),
  94. child: Container(
  95. height: 50,
  96. child: RaisedButton(
  97. onPressed: () {
  98. if (_formKey.currentState.validate()) {
  99. _calculate();
  100. }
  101. },
  102. child: Text(
  103. "Calcular",
  104. style: TextStyle(color: Colors.white, fontSize: 25),
  105. ),
  106. color: Colors.deepPurple,
  107. ),
  108. )),
  109. Text(_info,
  110. textAlign: TextAlign.center,
  111. style: TextStyle(color: Colors.deepPurple, fontSize: 25))
  112. ],
  113. ),
  114. ),
  115. ),
  116. );
  117. }
  118. }
rqqzpn5f

rqqzpn5f1#

解释如下。
让我们考虑一下这一点适用行:

  1. _formKey.currentState.validate()

消息
无法无条件调用方法“validate”,因为接收方可以为“null”。尝试使调用有条件(使用'?.')或向目标('!').
这意味着在“validate”之前的属性,也就是“currentState”,在某些情况下可能为null(https://dart.dev/null-safety了解更多信息)。
在它实际为null的情况下,您不能调用“validate”方法,因为null没有“validate”方法。换句话说,自从做了这个

  1. 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. _formKey.currentState!.validate();

1.使用“null aware operator”(?.):您不确定在这种情况下currentState是否可以为null。你告诉你的编译器在引擎盖下写这个:

  1. if(_formKey.currentState != null) {
  2. _formKey.currentState.validate();
  3. }
展开查看全部
mfuanj7w

mfuanj7w2#

简单地加上'!在.validate()之前使用“”或“?”。因此,更改这一行:

  1. if (_formKey.currentState.validate()) {

收件人:

  1. if (_formKey.currentState!.validate()) {

这是因为dart 2.0添加了null safety operators。您可以在此链接中阅读更多详细信息:https://dart.dev/null-safety

kfgdxczn

kfgdxczn3#

试试这样的方法:

  1. validator: (value) {
  2. if (value!.length < 1) return 'Empty field';
  3. return null;
  4. }
jm81lzqq

jm81lzqq4#

尝试在validate()方法之前添加null安全性

rkttyhzu

rkttyhzu5#

  1. GlobalKey<FormState> _formKey = GlobalKey();
  2. TextButton(
  3. onPressed: () {
  4. if(_formKey.currentState!.validate()){
  5. ***code
  6. }
  7. },
  8. style: ButtonStyle(
  9. backgroundColor: MaterialStatePropertyAll(
  10. Colors.green.shade900),
  11. ),
  12. child: const Text(
  13. "Save",
  14. style: TextStyle(color: Colors.white),
  15. ),
  16. ),
  17. Use this one

相关问题