颤振:在计时器上调用关闭函数时没有这样的方法错误

问题描述

我正在使用计时器类在特定时间后自动注销,但我在空错误调用了该方法 我的自动注销代码是:

import 'dart:async';
import 'package:cornershop_tech_1/controller/logoutController.dart';
class Autologout{
  logout logout=new logout();
  Timer _timer;
  void initializeTimer(context) {
    if (!_timer.isActive) {
      _timer= Timer(Duration(seconds: 300),() {
        print('timer Initialized');
        logout.logoutUser(context); });
    }
    else {
      _timer.cancel();
      _timer= Timer(Duration(seconds: 300),() {
        print('timer Initialized');
        logout.logoutUser(context); });
    }
  }
  bool handleUserInteraction(context,[_]) {
    if (!_timer.isActive) {
      return false;
    }
    _timer.cancel();
    initializeTimer(context);
    return true;
  }
}

从导致小部件的相关错误调用函数是:

Autologout autologout = new Autologout();
 @override
  void initState() {
    // Todo: implement initState
    super.initState();
    autologout.initializeTimer(context);
    getPrefs();
  }
  void _setAutologout([_]){
    autologout.handleUserInteraction(context,[_]);
  }
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: _setAutologout,onPanDown: _setAutologout,onScaleStart: _setAutologout,

错误是:

NoSuchMethodError: method not found: 'b' on null
js_primitives.dart:47     at lr.ku (http://localhost:51981/main.dart.js:52059:28)
js_primitives.dart:47     at Jk.SN (http://localhost:51981/main.dart.js:57212:9)
js_primitives.dart:47     at Object.eval (eval at be_ (http://localhost:51981/main.dart.js:4370:8),<anonymous>:3:37)
js_primitives.dart:47     at a7I.$0 (http://localhost:51981/main.dart.js:71691:31)
js_primitives.dart:47     at kR.Xl (http://localhost:51981/main.dart.js:71865:9)
js_primitives.dart:47     at kR.eM (http://localhost:51981/main.dart.js:71869:30)
js_primitives.dart:47     at kR.a9X (http://localhost:51981/main.dart.js:71665:3)
js_primitives.dart:47     at kR.jy (http://localhost:51981/main.dart.js:71603:3)
js_primitives.dart:47     at xZ.acJ (http://localhost:51981/main.dart.js:93512:14)
js_primitives.dart:47     at Object.eval (eval at be_ (http://localhost:51981/main.dart.js:4370:8),<anonymous>:3:37)

_timer.close() 肯定会出现此错误,因为在 _initializeTimer() 函数中使用此函数之前,我的代码运行良好,但我不知道为什么会出现此错误。我尝试从 _timer.close()删除_handleUserInteraction(),但没有成功。

请帮忙

解决方法

似乎 isActive 在尚未初始化时调用了计时器。

试试这个:

if (!(_timer?.isActive == true)) {
  _timer = Timer(Duration(seconds: 300),() {
    print('timer Initialized');
    logout.logOutUser(context); });
}
else {
  _timer?.cancel();
  _timer = Timer(Duration(seconds: 300),() {
    print('timer Initialized');
    logout.logOutUser(context); });
}

因为计时器是 nullable 变量,所以它的所有方法调用都应该是 null safe 例如:timer?.close()、timer?.isActive ...等

最好将整个项目迁移到空安全