【发布时间】:2019-03-07 05:48:18
【问题描述】:
我需要创建一个登录表单。用户成功登录后,我需要启动某种计时器(例如:3 分钟),所以如果用户对应用程序或其他词没有反应,如果颤动应用程序状态暂停、暂停或不活动超过 3 分钟。该应用程序将转到主登录页面。只要用户与应用程序进行交互,我就需要取消计时器,并且只需要启动计时器应用程序状态为暂停、暂停或非活动状态。我该怎么做?
我尝试实现“WidgetsBindingObserver”,但它看起来不像我想要的那样工作。如果用户成功进入并在应用程序中导航,则 WidgetsBindingObserver 失败(错误:小部件的状态对象不再出现在小部件树中)。
我的问题是如何实现基于时间的 Flutter 应用程序生命周期,只要用户与应用程序有交互?如果没有用户交互,生命周期计时器将启动,如果在计时器结束之前有用户交互,则必须取消计时器。
class _MyUserHomePageState extends State<MyUserHomePage> with WidgetsBindingObserver {
AppLifecycleState _appLifecycleState;
@override
void initState() {
_appStatePasue = false;
WidgetsBinding.instance.addObserver(this);
super.initState();
}
// TODO: DID_CHANGE_APP_LIFE_CYCLE
void didChangeAppLifecycleState(AppLifecycleState state) {
setState(() {
_appLifecycleState = state;
if(_appLifecycleState == AppLifecycleState.paused ||
_appLifecycleState == AppLifecycleState.inactive ||
_appLifecycleState == AppLifecycleState.suspending) {
_appStatePasue = true;
print("timer---fired: $_appLifecycleState");
_timer = Timer.periodic(Duration(minutes: 1), _capitalCallback);
print(_appLifecycleState);
} else {
_appStatePasue = false;
}
});
}
// TODO: APP_LIFE_CYCLE__CALLBACK
void _capitalCallback(_timer) {
if(_appStatePasue == true) {
_timer.cancel();
print("return---main---page: $_appLifecycleState");
setState(() {
Navigator.push(
context,
SlideRightRoute(widget: MyApp())
);
});
} else {
_timer.cancel();
print("timer---canceled: $_appLifecycleState");
}
}
@override
void dispose() {
super.dispose();
}
@override
void onDeactivate() {
super.deactivate();
}
@override
Widget build(BuildContext context) {
return new Scaffold (
);
}
}
【问题讨论】: