Flutter 2.5.3退出登录时触发Null check operator used on a null值错误
错误根因
退出登录时你调用了Auth.logout()方法,将_token、_userId属性全部置空后触发了状态通知,此时ChangeNotifierProxyProvider的update回调会被自动触发,你在回调中直接使用!强制对可能为空的auth.token、auth.userId做解包操作,空值被强制解包就触发了本次报错。
同时你在Auth类中定义的userId getter也直接使用了!强制解包可空属性_userId,未登录状态下调用该getter也会触发同类错误。
修复步骤
1. 调整Auth类的userId getter逻辑
将userId改为可空返回,或者未登录时返回空字符串,避免强制解包空值:
// 修改前 String get userId { return _userId!; } // 修改后(二选一即可) // 方案1:返回可空类型,和token逻辑保持一致 String? get userId { if (_expiryDate != null && _expiryDate!.isAfter(DateTime.now()) && _userId != null) { return _userId; } return null; } // 方案2:始终返回非空值,未登录时返回空字符串 // String get userId => _userId ?? '';
2. 调整ChangeNotifierProxyProvider的update逻辑
在更新Products、Orders实例前先判断登录状态,未登录时直接返回空实例,不对空属性做强制解包:
ChangeNotifierProxyProvider<Auth, Products>( update: (context, auth, previousProducts) { // 未登录状态直接返回空Products实例 if (!auth.isAuth) return Products('', '', []); // 登录状态下isAuth已经确认token不为空,此时解包安全 return Products( auth.token!, auth.userId!, previousProducts == null ? [] : previousProducts.items ); }, create: (_) => Products('', '', []), ), ChangeNotifierProxyProvider<Auth, Orders>( update: (context, auth, previousOrders) { if (!auth.isAuth) return Orders('', [], ''); return Orders( auth.token!, previousOrders == null ? [] : previousOrders.orders, auth.userId! ); }, create: (_) => Orders('', [], ''), ),
内容的提问来源于stack exchange,提问作者Cláudio Vitor Dantas
相关产品推荐
相关产品推荐

