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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:08