diff --git a/android/app/release/output.json b/android/app/release/output.json index 6063f44..940283b 100644 --- a/android/app/release/output.json +++ b/android/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":20220531,"versionName":"1.5.2","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":20220620,"versionName":"1.5.3","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/lib/components/commonFun.dart b/lib/components/commonFun.dart index d46ebdc..3f719ae 100644 --- a/lib/components/commonFun.dart +++ b/lib/components/commonFun.dart @@ -199,6 +199,8 @@ clear_user_info() { // 区县中心地址 center_latitude = -1; // 区县中心纬度 center_longitude = -1; // 区县中心经度 + userLogin = -1; //设置用户登录成功标志:1 成功,0 失败,-1 处理中 + tabsState = -1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 } // 511528、兴文县 @@ -320,6 +322,12 @@ Future sysPop() async { await SystemChannels.platform.invokeMethod('SystemNavigator.pop'); } +int tabsState = -1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 +// resumed:可见的,并能响应用户的输入。 +// inactive:处在不活动状态,无法处理用户响应。 +// paused:不可见并不能响应用户的输入,但是在后台继续活动中。 +int userLogin = -1; //用户登录成功标志:1 成功,0 失败,-1 处理中 + //人脸注册和人脸识别登录成功标志 int faceReg = -1; //1 成功,0 失败,-1 处理中 int faceLogin = -1; //1 成功,0 失败,-1 处理中 diff --git a/lib/components/dioFun.dart b/lib/components/dioFun.dart index 7334b46..dd6e120 100644 --- a/lib/components/dioFun.dart +++ b/lib/components/dioFun.dart @@ -2676,6 +2676,9 @@ Future faceLoginFun({@required String filePath, @required BuildContext context}) g_userInfo.setUserInfoFaceLogin(_mapGetData).then((value) { // 一套APP适应多个区县登录过程04、登录成功,开始使用保存的登录信息预加载数据,并设置faceLogin = 1 faceLogin = 1; //设置人脸验证成功标志。1 成功,0 失败,-1 处理中 + userLogin = 1; //设置用户登录成功标志:1 成功,0 失败,-1 处理中 + tabsState = 1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 + print("tabsState = $tabsState"); startGetStatisDataNew(); // 2、登录前提前获取统计数据,改善用户登录体验 }); //获取其他用户信息 @@ -2693,6 +2696,9 @@ Future faceLoginFun({@required String filePath, @required BuildContext context}) }); } else { faceLogin = 0; //设置人脸验证成功标志。1 成功,0 失败,-1 处理中 + userLogin = 0; //设置用户登录成功标志:1 成功,0 失败,-1 处理中 + tabsState = -1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 + print("tabsState = $tabsState"); print('人脸验证失败。'); Navigator.pushNamed(context, '/'); Fluttertoast.showToast( diff --git a/lib/pages/Login/LoginByName3.dart b/lib/pages/Login/LoginByName3.dart index a006974..9c5b58c 100644 --- a/lib/pages/Login/LoginByName3.dart +++ b/lib/pages/Login/LoginByName3.dart @@ -160,6 +160,9 @@ class _LoginPageState extends State { if (true == response.data["data"]["is_login"]) { print('登录成功'); print('response.data = ${response.data}'); + userLogin = 1; //设置用户登录成功标志:1 成功,0 失败,-1 处理中 + tabsState = 1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 + print("tabsState = $tabsState"); // 一套APP适应多个区县登录过程02、进行登录验证,保存登录信息 if (bRemmberPW) { @@ -207,6 +210,9 @@ class _LoginPageState extends State { // Navigator.pushNamed(context, '/tabs', arguments: g_iIndex); } else { print('登录失败:${response.data["data"]}'); + userLogin = 0; //设置用户登录成功标志:1 成功,0 失败,-1 处理中 + tabsState = -1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 + print("tabsState = $tabsState"); bLoginVerify = false; //处理延时登录,判断用户名登录是否验证通过 bPreLoading = false; try_setState(); // 登录失败后,刷新页面 diff --git a/lib/pages/tabs/Tabs.dart b/lib/pages/tabs/Tabs.dart index b416482..be0e211 100644 --- a/lib/pages/tabs/Tabs.dart +++ b/lib/pages/tabs/Tabs.dart @@ -28,7 +28,7 @@ class Tabs extends StatefulWidget { _TabsState createState() => _TabsState(); } -class _TabsState extends State { +class _TabsState extends State with WidgetsBindingObserver { // 初始化插件 DisableScreenshots _watermarkPlugin = DisableScreenshots(); @@ -86,6 +86,33 @@ class _TabsState extends State { }); init(); + + tabsState = 1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 + print("tabsState = $tabsState"); + // 注册应用生命周期监听 + WidgetsBinding.instance.addObserver(this); + } + + //监听App生命周期回调 + @override + void didChangeAppLifecycleState(AppLifecycleState state) async { + print("$state"); + tabsState = -1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 + switch (state) { + // 处于这种状态的应用程序应该假设他们可能在任何时候暂停 + case AppLifecycleState.inactive: + break; + case AppLifecycleState.resumed: // 从后台切前台,界面可见 + tabsState = 1; //Tabs页面是否在前台:1 前台resumed,0 paused,-1 处理中 + break; + case AppLifecycleState.paused: // 界面不可见,后台 + case AppLifecycleState.detached: // APP 结束时调用 + break; + } + print("tabsState = $tabsState"); + // resumed:可见的,并能响应用户的输入。 + // inactive:处在不活动状态,无法处理用户响应。 + // paused:不可见并不能响应用户的输入,但是在后台继续活动中。 } init() async { @@ -97,7 +124,10 @@ class _TabsState extends State { WidgetsFlutterBinding.ensureInitialized(); FlutterBackgroundService.initialize(onStart); if (g_bVoiceRemind) { - doRemind(); + // 如果是安卓平台允许后台提醒,如果是IOS平台、必须在前台才提醒 + if (Platform.isAndroid || (Platform.isIOS && 1 == tabsState)) { + doRemind(); + } } else { Future.delayed(Duration(seconds: 1), () { FlutterBackgroundService().sendData({"action": "stopService"}); @@ -108,6 +138,8 @@ class _TabsState extends State { @override void dispose() { + // 移除生命周期监听 + WidgetsBinding.instance.removeObserver(this); super.dispose(); }