Flutter Provider监听未更新Wrapper组件,Firebase Auth注册成功后不跳转主页
问题原因
- 注册成功场景下未重置loading状态
你在注册按钮的onPressed回调中,仅当注册返回结果为null(失败)时才执行setState(() => loading = false),注册成功时没有重置loading状态,页面会一直停留在Loading组件上,自然看不到Wrapper触发的页面跳转。 - 存在重复初始化Firebase的冗余逻辑
main函数中已经执行过await Firebase.initializeApp(),_AppState中又定义了一次初始化Future,重复初始化可能引发不可预期的异常。
修复方案
1. 修改注册按钮的onPressed逻辑
将原有的注册逻辑补充成功后的loading重置,代码修改如下:
onPressed: () async { if (_formKey.currentState!.validate()) { setState(() => loading = true); dynamic result = await _auth .registerWithEmailandPassword( displayName, email, password); if (result == null) { setState(() { error = 'please supply a valid email'; loading = false; }); } else { // 注册成功也重置loading状态 setState(() => loading = false); } } },
2. 移除冗余的Firebase初始化逻辑
删除_AppState中重复的初始化逻辑,修改App类代码如下:
class App extends StatelessWidget { @override Widget build(BuildContext context) { return const MyApp(); } }
因为main函数中已经完成了Firebase的初始化等待,不需要再用FutureBuilder二次判断初始化状态。
可选优化:注册成功后手动更新displayName
你当前的注册方法没有把传入的displayName设置到Firebase用户信息中,如果后续需要用到用户名可以补充这一步,修改AuthService的注册方法:
//register with email and password Future registerWithEmailandPassword( String name, String email, String password) async { try { UserCredential result = await _auth.createUserWithEmailAndPassword( email: email, password: password); User? user = result.user; // 补充设置用户名 await user?.updateDisplayName(name); return user; } catch (e) { print(e.toString()); return null; } }
内容的提问来源于stack exchange,提问作者Måns Björn
相关产品推荐
相关产品推荐

