flutter - 谁能告诉我为什么我在 Flutter 中会出现这个错误?

标签 flutter dart visual-studio-code

当我点击我的登录按钮时我得到了这个错误,我期待验证器会工作但是我每次点击我的登录按钮时我都得到这个错误

════════ 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      _LoginPageState.build.<anonymous closure>
package:project_ukk/…/login/login_page.dart:153
#1      _InkResponseState._handleTap
package:flutter/…/material/ink_well.dart:989
#2      GestureRecognizer.invokeCallback
package:flutter/…/gestures/recognizer.dart:198
#3      TapGestureRecognizer.handleTapUp
package:flutter/…/gestures/tap.dart:608
#4      BaseTapGestureRecognizer._checkUp
package:flutter/…/gestures/tap.dart:296
#5      BaseTapGestureRecognizer.handlePrimaryPointer
package:flutter/…/gestures/tap.dart:230
#6      PrimaryPointerGestureRecognizer.handleEvent
package:flutter/…/gestures/recognizer.dart:563
#7      PointerRouter._dispatch
package:flutter/…/gestures/pointer_router.dart:94
#8      PointerRouter._dispatchEventToRoutes.<anonymous closure>
package:flutter/…/gestures/pointer_router.dart:139
#9      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:539:8)
#10     PointerRouter._dispatchEventToRoutes
package:flutter/…/gestures/pointer_router.dart:137
#11     PointerRouter.route
package:flutter/…/gestures/pointer_router.dart:123
#12     GestureBinding.handleEvent
package:flutter/…/gestures/binding.dart:439
#13     GestureBinding.dispatchEvent
package:flutter/…/gestures/binding.dart:419
#14     RendererBinding.dispatchEvent
package:flutter/…/rendering/binding.dart:322
#15     GestureBinding._handlePointerEventImmediately
package:flutter/…/gestures/binding.dart:374
#16     GestureBinding.handlePointerEvent
package:flutter/…/gestures/binding.dart:338
#17     GestureBinding._flushPointerEventQueue
package:flutter/…/gestures/binding.dart:296
#18     GestureBinding._handlePointerDataPacket
package:flutter/…/gestures/binding.dart:279
#22     _invoke1 (dart:ui/hooks.dart:170:10)
#23     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:331:7)
#24     _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31)
(elided 3 frames from dart:async)
Handler: "onTap"
Recognizer: TapGestureRecognizer#db891
    debugOwner: GestureDetector
    state: possible
    won arena
    finalPosition: Offset(296.1, 619.7)
    finalLocalPosition: Offset(266.1, 36.2)
    button: 1
    sent tap down

这是我的 login_page.dart

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:project_ukk/constants/color_constant.dart';
import 'package:project_ukk/constants/font_and_padding.dart';
import 'package:project_ukk/pages/reset_password/reset_password.dart';
import 'package:project_ukk/pages/signUp/signup_page.dart';
import 'package:project_ukk/pages/user_page/navbar.dart';
import 'package:flutter_svg/svg.dart';

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

  @override
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  //Form Key
  final _formKey = GlobalKey<FormState>();

  var email = "";
  var password = "";

  final emailController = TextEditingController();
  final passwordController = TextEditingController();

  @override
  void dispose() {
    // Clean up the controller when the widget is disposed.
    emailController.dispose();
    passwordController.dispose();
    super.dispose();
  }

  clearText() {
    emailController.clear();
    passwordController.clear();
  }

  userLogin() async {
    try {
      await FirebaseAuth.instance
          .signInWithEmailAndPassword(email: email, password: password);
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(
          builder: (context) => PageNavBar(),
        ),
      );
    } on FirebaseAuthException catch (e) {
      if (e.code == 'user-not-found') {
        print("No User Found for that Email");
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            backgroundColor: Colors.orangeAccent,
            content: Text(
              "No User Found for that Email",
              style: TextStyle(fontSize: 18.0, color: Colors.black),
            ),
          ),
        );
      } else if (e.code == 'wrong-password') {
        print("Wrong Password Provided by User");
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            backgroundColor: Colors.orangeAccent,
            content: Text(
              "Wrong Password Provided by User",
              style: TextStyle(fontSize: 18.0, color: Colors.black),
            ),
          ),
        );
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    //Email Field
    final emailField = TextFormField(
      autofocus: false,
      controller: emailController,
      keyboardType: TextInputType.emailAddress,
      validator: (value) {
        if (value == null || value.isEmpty) {
          return 'Please Enter Email';
        } else if (!value.contains('@')) {
          return 'Please Enter Valid Email';
        }
        return null;
      },
      textInputAction: TextInputAction.next,
      decoration: InputDecoration(
        prefixIcon: Icon(Icons.mail),
        contentPadding: EdgeInsets.fromLTRB(20, 15, 20, 15),
        hintText: "Email",
        border: OutlineInputBorder(
          borderRadius: BorderRadius.circular(10),
        ),
      ),
    );
    //Password Field
    final passwordField = TextFormField(
      autofocus: false,
      controller: passwordController,
      obscureText: true,
      validator: (value) {
        if (value == null || value.isEmpty) {
          return 'Please Enter Password';
        }
        return null;
      },
      textInputAction: TextInputAction.next,
      decoration: InputDecoration(
        prefixIcon: Icon(Icons.vpn_key),
        contentPadding: EdgeInsets.fromLTRB(20, 15, 20, 15),
        hintText: "Password",
        border: OutlineInputBorder(
          borderRadius: BorderRadius.circular(10),
        ),
      ),
    );
    final loginButton = Material(
      elevation: 2,
      borderRadius: BorderRadius.circular(50),
      child: Container(
        width: MediaQuery.of(context).size.width,
        height: 60,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(50),
          gradient: LinearGradient(
            colors: const [kDarkModerateCyan, kModerateCyan],
            begin: Alignment.centerLeft,
            end: Alignment.centerRight,
          ),
        ),
        child: Material(
          borderRadius: BorderRadius.circular(50),
          color: Colors.transparent,
          child: Center(
            child: MaterialButton(
              child: Text(
                "Login",
                textAlign: TextAlign.center,
                style: textButton,
              ),
              padding: EdgeInsets.fromLTRB(20, 10, 20, 15),
              minWidth: MediaQuery.of(context).size.width,
              onPressed: () {
                // Validate returns true if the form is valid, otherwise false.
                if (_formKey.currentState!.validate()) {
                  setState(() {
                    email = emailController.text;
                    password = passwordController.text;
                  });
                  userLogin();
                }
              },
            ),
          ),
        ),
      ),
    );
    final forgotPassword = Container(
      padding: EdgeInsets.symmetric(
        vertical: 10,
      ),
      child: GestureDetector(
        onTap: () => {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => ResetPassword(),
            ),
          ),
        },
        child: Text(
          'Forgot Password ?',
          style: TextStyle(
            decoration: TextDecoration.underline,
            color: Colors.grey,
          ),
        ),
      ),
    );
    final registerNow = Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          "Don't have an account? ",
          style: TextStyle(color: Colors.grey),
        ),
        GestureDetector(
          child: Text(
            "Register Now",
            style: TextStyle(
              color: kPrimaryColor,
              fontWeight: FontWeight.bold,
              fontSize: 15,
            ),
          ),
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => SignUpPage(),
              ),
            );
          },
        ),
      ],
    );

    return Scaffold(
      backgroundColor: kWhiteColor,
      body: Stack(
        key: _formKey,
        children: <Widget>[
          SingleChildScrollView(
            child: Column(
              children: <Widget>[
                Container(
                  width: MediaQuery.of(context).size.width,
                  height: 300,
                  decoration: BoxDecoration(
                    color: kWhiteColor,
                    borderRadius: BorderRadius.only(
                      bottomLeft: Radius.circular(100),
                      bottomRight: Radius.circular(100),
                    ),
                    gradient: LinearGradient(
                      colors: [kDarkModerateCyan, kModerateCyan],
                      stops: [0.0, 1],
                      begin: Alignment.topCenter,
                      end: Alignment.bottomCenter,
                    ),
                  ),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      SizedBox(
                        height: 60,
                      ),
                      SizedBox(
                        width: 200,
                        height: 200,
                        child: SvgPicture.asset(
                          'assets/logo.svg',
                          fit: BoxFit.contain,
                          color: kWhiteColor,
                        ),
                      ),
                    ],
                  ),
                ),
                Container(
                  padding: EdgeInsets.symmetric(
                    horizontal: 30,
                  ),
                  width: MediaQuery.of(context).size.width,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.end,
                    children: <Widget>[
                      SizedBox(
                        height: 70,
                      ),
                      emailField,
                      SizedBox(
                        height: 20,
                      ),
                      passwordField,
                      SizedBox(
                        height: 20,
                      ),
                      forgotPassword,
                      SizedBox(
                        height: 30,
                      ),
                      loginButton,
                      SizedBox(
                        height: 50,
                      ),
                      registerNow,
                    ],
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

我的代码还没有连接到 Firebase,因为我想测试我的验证器是否正常工作,但我却收到了这个错误。

最佳答案

您已经在 Stack 而不是 Form 中设置了表单键

要解决此问题,您可以简单地用 Form 包装您的 Stack,然后将您的 key 移动到该 Form

喜欢

...
return Scaffold(
      body: Form(
        key: _formKey,
        child: Stack(
          children: <Widget>[
...

除此之外,我建议将您的 UI 元素(登录名、电子邮件和忘记密码)放在 build 方法之外,要实现它,您必须为它们创建方法,而不是让一个字段/变量

关于flutter - 谁能告诉我为什么我在 Flutter 中会出现这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71089134/

相关文章:

dart - 如何将图像背景分配给 flutter 中的列

dart - 发现 Flutter W/zipro ( 2568) : Error opening archive build\app\outputs\apk\app. apk : ERROR: dump failed because no AndroidManifest. xml

list - Dart , flutter :范围索引

flutter - 从一个 Dart 类访问另一个 Dart 类的功能

dart - 使用抽屉导航并仅更改正文内容的正确方法是什么?

flutter - 如何显示抽屉或bottomNavigationBar

firebase - flutter 异步验证表单

string - 如何禁用字符串内的自动关闭单引号?

node.js - 如何在 Docker 容器内远程调试 NodeJs 应用程序?

java - 如何为 vscode 终端定义命令/变量?