【问题标题】:The method 'cancel' can't be unconditionally invoked because the receiver can be 'null'无法无条件调用“取消”方法,因为接收者可以为“空”
【发布时间】:2021-11-21 01:56:32
【问题描述】:

我有以下代码:

class Auth with ChangeNotifier {
  String? _token;
  DateTime? _expiryDate;
  String? _userId;
  Timer? _authTimer;

  String? get token {
    if (_expiryDate != null &&
        _expiryDate.isAfter(DateTime.now()) &&
        _token != null) {
      return _token;
    }
    return null;
  }

  Future<void> logout() async {
    _token = null;
    _userId = null;
    _expiryDate = null;
    if (_authTimer != null) {
      _authTimer.cancel();
      _authTimer = null;
    }
    notifyListeners();
    final prefs = await SharedPreferences.getInstance();
    // prefs.remove('userData');
    prefs.clear();
  }
}

还有以下错误:

方法“isAfter”不能被无条件调用,因为 接收者可以为“空”。尝试使呼叫有条件(使用'?.') 或向目标添加空检查 ('!')。

不能无条件调用“取消”方法,因为 接收者可以为“空”。尝试使呼叫有条件(使用'?.') 或向目标添加空检查 ('!')。

如何修复此错误消息?

【问题讨论】:

    标签: flutter null non-nullable


    【解决方案1】:

    将这些代码行更改为:

            _expiryDate!.isAfter(DateTime.now()) &&
    
          _authTimer!.cancel();
    
    

    问题在于 Dart 知道 _expiryDate_authTimer 可以是 null。但是,您可以通过在 if 语句中检查它们是否都不是 null 来断言它们此时不可能是 null。因此,您可以添加一个!,这是一个非空断言,基本上是说'我知道这个变量的值可以是null,但我确定它不能是null点”。

    【讨论】:

    • 非常好,是的。谢谢,我正在开发一个 ammulinium 应用程序,这对我很有帮助。非常好的老师。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多