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

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

我学习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))
            ],
          ),
        ),
      ),
    );
  }
}
rqqzpn5f

rqqzpn5f1#

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

_formKey.currentState.validate()

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

_formKey.currentState!.validate();

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

if(_formKey.currentState != null) {
       _formKey.currentState.validate();
    }
mfuanj7w

mfuanj7w2#

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

if (_formKey.currentState.validate()) {

收件人:

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

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

kfgdxczn

kfgdxczn3#

试试这样的方法:

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

jm81lzqq4#

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

rkttyhzu

rkttyhzu5#

GlobalKey<FormState> _formKey = GlobalKey();
 TextButton(
                                  onPressed: () {
                                    if(_formKey.currentState!.validate()){
                                     ***code
                                    }
                                   
                                  },
                                  style: ButtonStyle(
                                    backgroundColor: MaterialStatePropertyAll(
                                        Colors.green.shade900),
                                  ),
                                  child: const Text(
                                    "Save",
                                    style: TextStyle(color: Colors.white),
                                  ),
                                ),
Use this one

相关问题