Хотите добавить время ожидания сеанса в старое веб-приложение AngularDart (v1.24.0 SDK) - PullRequest
0 голосов
/ 18 марта 2020

У меня есть приложение AngularDart, созданное в 2016 году, в котором используются перечисленные ниже зависимости. Мой клиент хотел бы добавить в приложение время ожидания сеанса, и у меня нет первой идеи, как начать. Не помогает, что приложение было создано 4 года go и не на текущей версии. Любые предложения о том, какие библиотеки dart или angulardart могут включать компоненты, которые бы поддерживали эту потребность?

environment:
  sdk: '>=1.24.0 <2.0.0'

dependencies:
  angular: ^4.0.0+2
  angular_router: ^1.0.2
  angular_components: ^0.6.0
  json_object: any
  http: "^0.11.3+14"
  angular_dart_ui_bootstrap: '>=0.0.1'
  ng_bootstrap: ^0.9.2
  dartson: "^0.2.7"
  browser_detect: "^1.0.4"
  archive: "^1.0.33"
  build: "^0.11.0"
  intl: "^0.15.6"

dev_dependencies:
  browser: ^0.10.0
  dart_to_js_script_rewriter: ^1.0.1
  test: ^0.12.0
  angular_test: ^1.0.0

transformers:
- dartson
- angular:
    entry_points:
      - web/main.dart
      - test/**_test.dart
- test/pub_serve:
    $include: test/**_test.dart
- dart_to_js_script_rewriter

# Uncomment the following in sdk 1.24+ to make pub serve
# use dartdevc (webdev.dartlang.org/tools/dartdevc).
#web:
#  compiler:
#    debug: dartdevc

Редактировать: Я пытался создать решение, добавив таймер и отслеживая взаимодействие с пользователем на странице.

В моем app_component.dart я добавил прослушиватели событий в функцию init. Я создаю таймер и устанавливаю его тайм-аут на одну минуту только для проверки.

Существует прослушиватель события запуска, который создает таймер при вызове. Это вызывается в первый раз после успешного входа пользователя в систему.

Существует таймер отмены, который отменяет таймер, обнуляет его, и, если пользователь все еще вошел в систему, заново создает таймер. Это вызывается активностью пользователя (нажатие клавиши или перемещение мыши) или выходом из системы. Если пользователь все еще входит в систему, когда он вызывается, таймер отменяется, устанавливается в ноль и создается снова. Если пользователь вышел из системы, он не был создан заново.

Смысл этого кода в том, чтобы запустить таймер при входе пользователя в систему, перезапустить его всякий раз, когда пользователь взаимодействует с приложением (нажатие клавиши или перемещение мыши) и выключите его, когда пользователь выйдет из системы.

Предполагается, что если в течение 1 минуты не будет активности пользователя, будет вызван handleTimerEvent. Это близко к работе, у меня неожиданное поведение.

      Future<Null> ngOnInit() async {

        _eventService.onStartIdleTimer.stream.listen((timerEvent) {
          if(idleTimer == null) {
            print(
                "Starting idleTimer: " + new DateTime.now().toLocal().toString());
            idleTimerStarted = new DateTime.now();
            idleTimer = new Timer(new Duration(minutes: 1), handleTimerEvent());
          }
        });

        _eventService.onCancelIdleTimer.stream.listen((timerEvent){
          if(idleTimer != null) {
            if (idleTimer.isActive) {
              print(
                  "Canceling idleTimer: " +
                      new DateTime.now().toLocal().toString());
              var diff = new DateTime.now().difference(idleTimerStarted);
              print(diff.inSeconds.toString() +" seconds elapsed.");

              idleTimer.cancel();
              idleTimer = null;
              if (isLoggedIn)
                _eventService.onStartIdleTimer.add(new IdleTimerEvent("Start"));
            }
          }
        });
  }

  handleTimerEvent(){
    print("In handleTimerEvent!");
    if(this.isLoggedIn){
      if(new DateTime.now().difference(idleTimerStarted).inMinutes > 1){
        print("Idle Timer passed configured limit.  Logging user out.");
        logoutForIdle();
      } else {
        _eventService.onStartIdleTimer.add(new IdleTimerEvent("Start"));
      }
    }
  }

  logoutForIdle() {
    _eventService.onError.add(new GenomicsErrorEvent()
      ..message = globals.idleTimeoutMessage
      ..dismissable = true
      ..alertType = alertType);

    logout();

    _eventService.onCancelIdleTimer.add(new IdleTimerEvent("Cancel"));
  }

Прежде всего, когда я вызываю Timer.cancel (), кажется, что обратный вызов запускается, что является неожиданным. И когда я жду времени ожидания, я получаю это исключение:

EXCEPTION: NullError: method not found: 'call$0' on null
STACKTRACE: 
TypeError: Cannot read property 'call$0' of null
    at StaticClosure.dart._rootRun (http://localhost:63114/main.dart.js:7427:18)
    at _ZoneDelegate.run$2 (http://localhost:63114/main.dart.js:10632:41)
    at NgZone.dart.NgZone._run$4 (http://localhost:63114/main.dart.js:112512:24)
    at Object.eval (eval at Closure_forwardCallTo (http://localhost:63114/main.dart.js:4663:14), <anonymous>:3:45)
    at _CustomZone.run$1 (http://localhost:63114/main.dart.js:10765:41)
    at _CustomZone.runGuarded$1 (http://localhost:63114/main.dart.js:10681:21)
    at _CustomZone_bindCallback_closure.dart._CustomZone_bindCallback_closure.call$0 (http://localhost:63114/main.dart.js:10836:27)
    at NgZone__createTimer_closure.dart.NgZone__createTimer_closure.call$0 (http://localhost:63114/main.dart.js:112664:19)
    at StaticClosure.dart._rootRun (http://localhost:63114/main.dart.js:7432:16)
    at _ZoneDelegate.run$2 (http://localhost:63114/main.dart.js:10632:41)
ORIGINAL EXCEPTION: NullError: method not found: 'call$0' on null

Я очень растерялся.

Решено

1 Ответ

1 голос
/ 20 марта 2020
idleTimer = new Timer(new Duration(minutes: 1), handleTimerEvent());

Должно быть

idleTimer = new Timer(new Duration(minutes: 1), handleTimerEvent);

Код, который вы написали, вызывает handleTimerEvent при создании таймера и передает null (неявное возвращаемое значение из handleTimerEvent()) как обратный вызов к таймеру. Вы вызываете его, а не передаёте как обратный вызов, поэтому он работает. Когда таймер срабатывает, он пытается вызвать null как функцию, исключение, которое вы видите. Непонятно, почему отмена не работает - возможно, все работает не в том порядке, и вы пытаетесь отменить до запуска таймера.

...