紧跟在 Create-account 成功之后的 6 位数字验证码页(TAPD #1003129)。重发按钮的可点状态由 EmailCodeThrottle 的节流阶梯驱动(立即 / +1 分钟 / +3 分钟 / +10 分钟 / +24 小时),阶梯没到之前按钮显示剩余秒数倒计时、不可点。Stub/dev 模式下(没有真实邮箱后端)会在输入框上方额外显示一个提示框直接给出 6 位码,方便测试。
lib/features/auth/presentation/email_code_page.dart(193 行)authControllerProvider(verifyCode / resendCode;读 state.pendingEmail 作为副标题、state.debugCode 作为 stub 提示)EmailCodeThrottle.remaining——与忘记密码、修改凭据 共用同一套重发节流公式AuthScaffold / PolicyFooterdeviceId(可空,原样透传)/email-code(EmailCodePage.routeName)lib/app.dart 的 onGenerateRoute(stub 模式下)蓝色提示框直接显示 6 位调试码;6 位数字输入框(letterSpacing: 10,仅数字,maxLength: 6);重发链接/倒计时;重发节流规则的说明小字;主按钮 "Verify"。
_verify()
→ 不足 6 位 → 弹 SnackBar 提示,不发请求
→ authControllerProvider.notifier.verifyCode(code)
→ 成功 → finishAuthFunnel(context, deviceId)
AuthStatus.signedIn;错误/过期码走统一的 ref.listen SnackBar 提示,页面留在原地供重试或重发_resend() → authControllerProvider.notifier.resendCode()(复用 state.pendingEmail)→ 成功则 _sendsMade 自增、重新计时watch authControllerProvider 读 state.busy / state.pendingEmail(副标题)/ state.debugCode(stub 提示框);本地 Timer.periodic(每秒 tick 一次)驱动倒计时显示,dispose() 时取消。
无。
无——本页逻辑单一(6 位码校验 + 节流重发),与忘记密码、修改凭据 的验证码步骤是同一套机制的三处复用,互相之间没有已知分歧。