You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter邮箱验证功能异常求助:按Cookbook实现却无法正常校验

问题原因及修复方案

你的代码存在三个关键问题,导致邮箱验证功能未按预期工作:

1. 表单验证逻辑完全颠倒

_validate方法的逻辑写反了:当前代码是验证通过时直接返回,不执行登录逻辑;验证失败时反而进入登录状态,这和需求完全相反:

void _validate() {
  final form = _formKey.currentState;
  if (form?.validate() ?? false) {
    return; // 错误:验证通过应该执行登录,而非返回
  }
  setState(() {
    loggedIn = true;
    name = _nameController.text;
  });
}

2. 邮箱正则表达式错误

你的正则[^@]+@[^.]+..+中,.是正则的通配符(匹配任意字符),而你需要匹配的是邮箱域名里的点,必须用\.转义。另外..+会匹配两个或更多任意字符,正确写法应为\..+(匹配一个点加后续有效字符)。

3. dispose方法位置错误

你把dispose方法写在了build方法内部,这会导致语法错误,应将其移到build方法外,作为_LoginScreenState类的顶层方法。


修复后的完整代码

import 'package:flutter/material.dart';

import 'stopwatch.dart';

class LoginScreen extends StatefulWidget {
  static const route = '/login';
  const LoginScreen({super.key});

  @override
  State<LoginScreen> createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final _nameController = TextEditingController();
  final _emailController = TextEditingController();
  final _formKey = GlobalKey<FormState>();
  bool loggedIn = false;
  String name = '';

  @override
  void dispose() {
    _emailController.dispose();
    _nameController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Login'),
      ),
      body: Center(
        child: loggedIn ? _buildSuccess() : _buildLoginForm(),
      ),
    );
  }

  Widget _buildSuccess() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        const Icon(Icons.check, color: Colors.orangeAccent),
        Text('Hi $name')
      ],
    );
  }

  Widget _buildLoginForm() {
    return Form(
        key: _formKey,
        child: Padding(
            padding: const EdgeInsets.all(20.0),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                TextFormField(
                  controller: _nameController,
                  decoration: const InputDecoration(labelText: 'Runner'),
                  validator: (text) =>
                      text!.isEmpty ? 'Enter the runner\'s name.' : null,
                ),
                TextFormField(
                  controller: _emailController,
                  keyboardType: TextInputType.emailAddress,
                  decoration: const InputDecoration(labelText: 'Email'),
                  validator: (text) {
                    if (text!.isEmpty) {
                      return 'Enter the runner\'s email.';
                    }
                    // 修正后的正则表达式
                    final regex = RegExp(r'[^@]+@[^.]+\..+');
                    if (!regex.hasMatch(text)) {
                      return 'Enter a valid email';
                    }
                    return null;
                  },
                ),
                const SizedBox(height: 20),
                ElevatedButton(
                  onPressed: _validate,
                  child: const Text('Continue'),
                ),
              ],
            )));
  }

  void _validate() {
    final form = _formKey.currentState;
    // 修正逻辑:验证通过才切换到登录状态
    if (form?.validate() ?? false) {
      setState(() {
        loggedIn = true;
        name = _nameController.text;
      });
    }
  }
}

内容的提问来源于stack exchange,提问作者user3523406

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:12:34