У меня есть приложение 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
Я очень растерялся.
Решено