Вот минимальный рабочий пример, который я написал для этого случая без какого-либо управления состоянием, вы можете попробовать его в dartpad . Вы выйдете из системы, если пользователь простаивает через 5 секунд.
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
MyApp({Key key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
LogoutTimerModel timerModel;
Timer logoutTimer;
int page = 1; // you could use enum
@override
void initState() {
super.initState();
timerModel = LogoutTimerModel();
timerModel.updateTimestamp(DateTime.now());
logoutTimer = Timer.periodic(Duration(seconds: 1), (time) {
DateTime currentTime = DateTime.now();
if(currentTime.difference(timerModel.timestamp).inSeconds > 5) {
setState((){
page = 0;
});
}
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Listener(
onPointerDown: (PointerEvent details) {
timerModel.updateTimestamp(DateTime.now());
},
child: Builder(
builder: (context) {
if(page == 1)
return LoginPage();
else
return LogoutPage();
}
)
)
);
}
}
class LoginPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("Login now, but wait for timeout to logout...")
),
);
}
}
class LogoutPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("Logout now")
),
);
}
}
class LogoutTimerModel {
DateTime timestamp;
void updateTimestamp(DateTime timestamp) {
this.timestamp = timestamp;
}
}
Поскольку ваш случай выглядит как глобальная операция, вы должны сделать это в MyApp
и обернуть его Listener
, чтобы сбросить отметку времени вот и все понятия.
Редактировать: Для тех, кто думает, что слушатель будет поглощен обычным событием нажатия кнопки, вот тест:
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
MyApp({Key key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
LogoutTimerModel timerModel;
Timer logoutTimer;
int page = 1; // you could use enum
@override
void initState() {
super.initState();
timerModel = LogoutTimerModel();
timerModel.updateTimestamp(DateTime.now());
logoutTimer = Timer.periodic(Duration(seconds: 1), (time) {
DateTime currentTime = DateTime.now();
if(currentTime.difference(timerModel.timestamp).inSeconds > 5) {
setState((){
page = 0;
});
}
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Listener(
onPointerDown: (PointerEvent details) {
timerModel.updateTimestamp(DateTime.now());
print("Omitted??");
},
child: Builder(
builder: (context) {
if(page == 1)
return LoginPage();
else
return LogoutPage();
}
)
)
);
}
}
class LoginPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
children: [
Text("Login now, but wait for timeout to logout..."),
FlatButton(
child: Text("case"),
onPressed: () {
print("Omit???");
}
)
]
)
),
);
}
}
class LogoutPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("Logout now")
),
);
}
}
class LogoutTimerModel {
DateTime timestamp;
void updateTimestamp(DateTime timestamp) {
this.timestamp = timestamp;
}
}
Результат:
Omitted??
Omit???
Omitted??
Omit???
Omitted??
Omit???
Omitted??
Omit???
Omitted??
Omit???
Omitted??
Omit???
Omitted??
Omit???
Кстати, я не тестировал код всеми способами, поэтому, если кто-то найдет что-то, что может повлиять на Listener
, не стесняйтесь комментировать, чтобы помочь другим.
Примечание: Возможно, вы захотите пройти как showDialog
, вы можете обернуть Listener
выше MaterialApp
в зависимости от требования.
Listener(child: MaterailApp ...