【问题标题】:Null check operator used on a null value in TexformField空值检查运算符用于 TexformField 中的空值
【发布时间】:2022-01-06 22:21:28
【问题描述】:

这是我的 TextFormField 代码,我收到错误“Null check operator used on a Null value”,如果我从当前状态中删除 null 检查运算符,则会引发另一个异常。

import 'package:firebase/sign_up.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';

 class First_Page extends StatefulWidget {
   const First_Page({Key? key}) : super(key: key);

     @override
     _First_PageState createState() => _First_PageState();
   }

    class _First_PageState extends State<First_Page> {
      final key= GlobalKey<FormState>();
      final _auth=FirebaseAuth.instance;
      final  User_email_id=TextEditingController();
      final user_Passowrd=TextEditingController();
       @override
      Widget build(BuildContext context) {
      final email_id=TextFormField(
      controller: User_email_id,
      key: key,
     validator: (value){
     if(value!.isEmpty){
      return "Please enter a value";
     }
   },
   decoration:InputDecoration(
     contentPadding:EdgeInsets.fromLTRB(20, 15, 20, 15),
     prefixIcon: Icon(
       Icons.mail,
     ),
     hintText: "Email-id",
     border: OutlineInputBorder(
       borderRadius: BorderRadius.circular(10)
     ),
   ),
 );

这是我的按钮代码和 Onpressed..

          Container(
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(10),
          gradient: LinearGradient(
            colors: <Color>[
              Colors.yellow,
              Colors.greenAccent,
            ]
          )
        ),
        child: ButtonTheme(
          padding:EdgeInsets.fromLTRB(20, 15, 20, 15) ,
          minWidth: 350,
          child: FlatButton(
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10)
            ),
            onPressed: (){
               if(key.currentState!.validate()){
                 print('Successful');
               }
            },
            child: Text(
                'Sign-in',
              style: TextStyle(
                fontSize: 15,
                fontWeight: FontWeight.bold,
              ),
            ),
        ),
        ),
      ),

这是我遇到的错误

======== Exception caught by gesture 
  ===============================================================
    The following _CastError was thrown while handling a gesture:
    Null check operator used on a null value

    When the exception was thrown, this was the stack: 
    #0      _First_PageState.build.<anonymous closure> (package:firebase/Sign_In.dart:119:39)
    #1      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:989:21)
    #2      GestureRecognizer.invokeCallback 
            (package:flutter/src/gestures/recognizer.dart:193:24)
    #3      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:608:11)
    #4      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5)
    #5      BaseTapGestureRecognizer.acceptGesture 
    (package:flutter/src/gestures/tap.dart:267:7)
    #6      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:157:27)
    #7      GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:444:20)
    #8      GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:420:22)
    #9      RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:278:11)
    #10     GestureBinding._handlePointerEventImmediately 
        (package:flutter/src/gestures/binding.dart:374:7)
    #11     GestureBinding.handlePointerEvent 
        (package:flutter/src/gestures/binding.dart:338:5)
    #12     GestureBinding._flushPointerEventQueue 
      (package:flutter/src/gestures/binding.dart:296:7)
    #13     GestureBinding._handlePointerDataPacket 
       (package:flutter/src/gestures/binding.dart:279:7)
    #17     _invoke1 (dart:ui/hooks.dart:185:10)
    #18     PlatformDispatcher._dispatchPointerDataPacket 
       (dart:ui/platform_dispatcher.dart:293:7)
    #19     _dispatchPointerDataPacket (dart:ui/hooks.dart:98:31)
        (elided 3 frames from dart:async)
    Handler: "onTap"
    Recognizer: TapGestureRecognizer#b49fb
     debugOwner: GestureDetector
     state: ready
     won arena
     finalPosition: Offset(172.0, 531.6)
     finalLocalPosition: Offset(150.6, 23.6)
     button: 1
     sent tap down

如果我从 Currentstate 中删除 null 运算符,则会显示错误“无法无条件调用方法 'validate',因为接收者可以是 'null'。”

【问题讨论】:

  • 这是因为 key.currentState 等于 null - 例如,您可以尝试:print('state: ${key.currentState}'); 并检查日志
  • @pskink 我是 Flutter 的新手,请您为我提供任何解决方案

标签: flutter dart null


【解决方案1】:

只有在确定值不为空时才使用 bang 运算符 !。否则使用问号?

// Good
if(value?.isEmpty ?? false){ // Here says If the value is null or is empty equal to the true. Operator `??` tells what you want to return if the value is null.
  return "Please enter a value";
}

// Bad
if(value!.isEmpty){ // Here says If the value not null and is empty equal to the true
  return "Please enter a value";
}
//...

在您的代码中key.currentStatevalue 为空,但您对Dart 说这里不为空。

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2021-01-24
    • 2022-07-06
    • 2022-01-18
    • 2021-11-03
    • 2023-03-16
    • 2022-06-15
    • 2021-07-09
    • 2021-04-29
    相关资源
    最近更新 更多