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
相关产品推荐
相关产品推荐

