This commit is contained in:
wyf
2025-08-18 18:19:56 +08:00
parent 111bd78a24
commit e5e405f205
23 changed files with 337 additions and 212 deletions

View File

@@ -11,6 +11,7 @@ import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/controller/device/device_calibration_controller.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/pages/policy/privacy_policy.dart';
getOnePicker(BuildContext context, List arr, int checkIndex,
Function onSelectedItemChanged,
@@ -1494,6 +1495,101 @@ void showSleepCalendarBottomSheet({
);
}
// Future showCustomConfirmOfWebViewDialog(
// BuildContext context, String name, String webviewUrl,
// {String btnName = "确定",
// bool showCancel = false,
// String cancelName = "取消",
// ConfirmDialogIcon icon = ConfirmDialogIcon.warn}) async {
// return showDialog(
// context: context,
// barrierDismissible: true,
// builder: (BuildContext context) {
// return Dialog(
// backgroundColor: Colors.white,
// insetPadding: EdgeInsets.all(0),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(10.0),
// ),
// child: Container(
// width: 640.rpx,
// padding: EdgeInsets.fromLTRB(22.rpx, 0, 20.rpx, 10.rpx),
// child: Column(
// mainAxisSize: MainAxisSize.min,
// crossAxisAlignment: CrossAxisAlignment.start,
// children: <Widget>[
// Container(
// alignment: Alignment.centerRight,
// child: closeIcon,
// ),
// SizedBox(height: 40.rpx),
// Container(
// height: MediaQuery.of(context).size.height * 0.4,
// child: PrivacyPolicyNewPage(
// sleepUri: webviewUrl,
// showAppbar: false,
// ),
// ),
// SizedBox(height: 20.rpx),
// Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// if (showCancel)
// Container(
// margin: EdgeInsets.only(
// top: 50.rpx, bottom: 40.rpx, right: 100.rpx),
// alignment: Alignment.center,
// child: InkWell(
// onTap: () {
// Get.back();
// },
// child: Container(
// width: 200.rpx,
// height: 60.rpx,
// alignment: Alignment.center,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(6),
// border: Border.all(color: Colors.black12)),
// child: Text(
// '$cancelName',
// style: TextStyle(
// color: Colors.black, fontSize: 30.rpx),
// ),
// ),
// ),
// ),
// Container(
// margin: EdgeInsets.only(top: 50.rpx, bottom: 40.rpx),
// alignment: Alignment.center,
// child: InkWell(
// onTap: () {
// Get.back(result: "confirm");
// },
// child: Container(
// width: 200.rpx,
// height: 60.rpx,
// alignment: Alignment.center,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(6),
// color: stringToColor("#D3B684")),
// child: Text(
// '$btnName',
// style:
// TextStyle(color: Colors.white, fontSize: 30.rpx),
// ),
// ),
// ),
// )
// ],
// )
// ],
// ),
// ),
// );
// },
// );
// }
Future showCustomConfirmOfWebViewDialog(
BuildContext context, String name, String webviewUrl,
{String btnName = "确定",
@@ -1504,29 +1600,33 @@ Future showCustomConfirmOfWebViewDialog(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return Dialog(
insetPadding: EdgeInsets.all(0),
backgroundColor: Colors.white,
insetPadding: EdgeInsets.zero, // 移除默认的内边距
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
child: Container(
width: 640.rpx,
width: screenSize.width, // 使用屏幕宽度
height: screenSize.height, // 使用屏幕高度
padding: EdgeInsets.fromLTRB(22.rpx, 0, 20.rpx, 10.rpx),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
alignment: Alignment.centerRight,
child: closeIcon,
),
SizedBox(height: 40.rpx),
// Container(
// height: MediaQuery.of(context).size.height * 0.4,
// child: Shopping(
// url: webviewUrl,
// ),
// alignment: Alignment.centerRight,
// child: closeIcon,
// ),
// SizedBox(height: 40.rpx),
Expanded(
// 使用 Expanded 让 WebView 占据剩余空间
child: PrivacyPolicyNewPage(
sleepUri: webviewUrl,
showAppbar: false,
),
),
SizedBox(height: 20.rpx),
Row(
mainAxisAlignment: MainAxisAlignment.center,
@@ -1555,24 +1655,51 @@ Future showCustomConfirmOfWebViewDialog(
),
),
),
Container(
margin: EdgeInsets.only(top: 50.rpx, bottom: 40.rpx),
alignment: Alignment.center,
child: InkWell(
onTap: () {
Get.back(result: "confirm");
},
child: Container(
width: 200.rpx,
height: 60.rpx,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
color: stringToColor("#D3B684")),
child: Text(
'$btnName',
style:
TextStyle(color: Colors.white, fontSize: 30.rpx),
// Container(
// margin: EdgeInsets.only(top: 50.rpx, bottom: 40.rpx),
// alignment: Alignment.center,
// child: InkWell(
// onTap: () {
// Get.back(result: "confirm");
// },
// child: Container(
// width: 200.rpx,
// height: 60.rpx,
// alignment: Alignment.center,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(6),
// color: stringToColor("#D3B684")),
// child: Text(
// '$btnName',
// style:
// TextStyle(color: Colors.white, fontSize: 30.rpx),
// ),
// ),
// ),
// )
CustomCard(
borderRadius: 12.rpx, // 圆角半径
onTap: () {
Get.back(result: "confirm");
},
colors: AppConstants().mhtNormalButton, // 渐变背景
gradientDirection: GradientDirection.horizontal,
child: Container(
// width: MediaQuery.sizeOf(context).width * 0.5, // 宽度占屏幕一半
// height: MediaQuery.sizeOf(context).height * 0.055,
constraints: BoxConstraints(
minWidth: 200.rpx,
minHeight: 60.rpx,
),
alignment: Alignment.center,
child: Text(
'$btnName',
style: TextStyle(
color: Colors.white, // 文字颜色
fontFamily: 'Inter',
fontSize: AppConstants().normal_text_fontSize, // 字体大小
fontWeight: FontWeight.w600,
letterSpacing: 0.0,
),
),
),

View File

@@ -10,6 +10,7 @@ import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/login/login_controller.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/model/api_response.dart';
@@ -551,7 +552,7 @@ class THBindTelWidget extends GetView<AuthBindTelController> {
UserInfoController userInfoController =
Get.find();
await userInfoController.getUserInfo();
MHTLoginController loginController =
LoginController loginController =
Get.find();
//TODO 微信回调监听操作全部跳转页面前成功以后移除监听,防止重复监听,其他方式登录成功也需要移出监听
loginController.fluwxCancelable?.cancel();

View File

@@ -4,6 +4,8 @@ import 'dart:io';
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get_storage/get_storage.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/CommonVariables.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
@@ -12,6 +14,7 @@ import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/model/WebSocketMessage.dart';
import 'package:vbvs_app/pages/common/bezier_bottom_navigation_bar.dart';
import 'package:vbvs_app/pages/common/selectDialog.dart';
import 'package:vbvs_app/pages/mh_page/MattressControl.dart';
import 'package:vbvs_app/pages/mh_page/homepage/component/HomeDeviceStausWidget.dart';
import 'package:vbvs_app/pages/mh_page/homepage/mht_sleep_report_page.dart';
@@ -122,8 +125,30 @@ class _HomePageState extends State<MainPageBBottomChange>
}
DateTime? _lastBackPressedTime; // 记录上一次返回的时间
final getStorage = GetStorage();
@override
Widget build(BuildContext context) {
// Future.delayed(const Duration(milliseconds: 0), () {
// String? isShowYingShiDialog = getStorage.read("isShowYingShiDialog");
// if (isShowYingShiDialog == null || isShowYingShiDialog != "true") {
// String btnName = "同意".tr;
// String cancelName = "取消".tr;
// if (Platform.isAndroid) {
// cancelName = "退出".tr;
// }
// showCustomConfirmOfWebViewDialog(context, "隐私协议".tr, getPrivacy(1),
// btnName: btnName, showCancel: true, cancelName: cancelName)
// .then((e) {
// if (e == "confirm") {
// getStorage.write("isShowYingShiDialog", "true");
// } else {
// if (cancelName == "退出") {
// SystemNavigator.pop();
// }
// }
// });
// }
// });
return Obx(() {
final currentLanguage =
languageController.selectLanguage.value; // 监听此变量变化

View File

@@ -5,6 +5,7 @@ import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import 'package:get_storage/get_storage.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
@@ -14,6 +15,7 @@ import 'package:vbvs_app/controller/message/message_controller.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/enum/LoginStatus.dart';
import 'package:vbvs_app/pages/common/selectDialog.dart';
import 'package:vbvs_app/pages/main_bottom/e_page.dart';
import 'package:vbvs_app/pages/main_bottom/home_page.dart';
import 'package:vbvs_app/pages/main_bottom/message_page.dart';
@@ -75,16 +77,56 @@ class MainPageBottomChange extends GetView<MainPageController> {
];
DateTime? _lastBackPressedTime; // 记录上一次返回的时间
final getStorage = GetStorage();
@override
Widget build(BuildContext context) {
Future.delayed(const Duration(milliseconds: 0), () {
String? isShowYingShiDialog = getStorage.read("isShowYingShiDialog");
if (isShowYingShiDialog == null || isShowYingShiDialog != "true") {
String btnName = "同意".tr;
String cancelName = "取消".tr;
if (Platform.isAndroid) {
cancelName = "退出".tr;
}
showCustomConfirmOfWebViewDialog(context, "隐私协议".tr, getPrivacy(1),
btnName: btnName, showCancel: true, cancelName: cancelName)
.then((e) {
if (e == "confirm") {
getStorage.write("isShowYingShiDialog", "true");
} else {
if (cancelName == "退出") {
SystemNavigator.pop();
}
}
});
}
});
return PopScope(
canPop: false,
// onPopInvokedWithResult: (disposition, result) async {
// if (Platform.isAndroid) {
// var flag = await _handleBackPressed(context); // 自定义返回逻辑
// if (flag) {
// SystemNavigator.pop();
// }
// }
// },
onPopInvokedWithResult: (disposition, result) async {
UserInfoController userInfoController = Get.find();
if (userInfoController.model.isProgrammaticPop) {
// 如果是程序触发,重置标记并忽略
userInfoController.model.isProgrammaticPop = false;
return; // 阻止处理
}
if (Platform.isAndroid) {
var flag = await _handleBackPressed(context); // 自定义返回逻辑
if (flag) {
SystemNavigator.pop();
}
// var flag = await _handleBackPressed(context); // 自定义返回逻辑
// if (flag) {
// SystemNavigator.pop();
// }
Get.back();
}
},
child: Obx(
@@ -170,7 +212,6 @@ class MainPageBottomChange extends GetView<MainPageController> {
controller.updateAll();
});
},
items: [
getBottomNavigationBarItem("assets/img/menu/home.svg",
"assets/img/menu/n_home.svg", "菜单.首页".tr),

View File

@@ -367,6 +367,7 @@ class _MHTBindDeviceSuccessState extends State<MHTBindDeviceSuccess> {
),
),
),
),
],
),

View File

@@ -423,6 +423,8 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
padding: EdgeInsets.zero,
borderRadius: 8,
onTap: () {
sleepReportController.model.type =
1;
showSleepCalendarBottomSheet(
type: sleepReportController
.model.type,

View File

@@ -16,6 +16,8 @@ import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/pages/common/selectDialog.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/mht_login_controller.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart';
@@ -119,17 +121,6 @@ class MHTLoginPage extends GetView<MHTLoginController> {
@override
Widget build(BuildContext context) {
MHTRegisterController registerController = Get.find();
bool isProgrammaticPop = false; // 标记变量
Future.delayed(const Duration(milliseconds: 300), () {
String? isShowYingShiDialog = getStorage.read("isShowYingShiDialog");
if (isShowYingShiDialog == null || isShowYingShiDialog != "true") {
String btnName = "同意".tr;
String cancelName = "取消".tr;
if (Platform.isAndroid) {
cancelName = "退出".tr;
}
}
});
return LayoutBuilder(builder: (context, cc) {
bodysize = cc;
@@ -176,21 +167,21 @@ class MHTLoginPage extends GetView<MHTLoginController> {
),
body: PopScope(
canPop: false,
onPopInvokedWithResult: (disposition, result) async {
if (isProgrammaticPop) {
// 如果是程序触发,重置标记并忽略
isProgrammaticPop = false;
return; // 阻止处理
}
// onPopInvokedWithResult: (disposition, result) async {
// if (isProgrammaticPop) {
// // 如果是程序触发,重置标记并忽略
// isProgrammaticPop = false;
// return; // 阻止处理
// }
if (Platform.isAndroid) {
// var flag = await _handleBackPressed(context); // 自定义返回逻辑
// if (flag) {
// SystemNavigator.pop();
// }
Get.back();
}
},
// if (Platform.isAndroid) {
// // var flag = await _handleBackPressed(context); // 自定义返回逻辑
// // if (flag) {
// // SystemNavigator.pop();
// // }
// Get.back();
// }
// },
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Container(
@@ -1258,8 +1249,10 @@ class MHTLoginPage extends GetView<MHTLoginController> {
controller.fluwxCancelable
?.cancel();
Checknetwork.subscription?.cancel();
isProgrammaticPop = true;
UserInfoController
userInfoController = Get.find();
userInfoController
.model.isProgrammaticPop = true;
MHTLoginController loginController =
Get.find();
loginController.model.account =
@@ -1445,14 +1438,6 @@ class MHTLoginPage extends GetView<MHTLoginController> {
0, 0),
child: InkWell(
onTap: () {
// showCustomConfirmOfWebViewDialog(
// context,
// "用户协议",
// "/#/pages/agreement/agreement?type=2&hideHead=true",
// btnName:
// "同意并继续");
// Get.toNamed(
// "/userAgreementPage");
Get.toNamed(
"/userPolicyPageNew",
arguments:
@@ -1497,14 +1482,6 @@ class MHTLoginPage extends GetView<MHTLoginController> {
0, 0),
child: InkWell(
onTap: () {
// showCustomConfirmOfWebViewDialog(
// context,
// "隐私协议",
// "/#/pages/agreement/agreement?type=1&hideHead=true",
// btnName:
// "同意并继续");
// Get.toNamed(
// "/privacyPolicyPage");
Get.toNamed(
"/privacyPolicyPageNew",
arguments:

View File

@@ -948,13 +948,7 @@ class RegisterPage extends GetView<MHTRegisterController> {
AlignmentDirectional(
0, 0),
child: InkWell(
onTap: () {
// showCustomConfirmOfWebViewDialog(
// context,
// "用户协议",
// "/#/pages/agreement/agreement?type=2&hideHead=true");
// Get.toNamed(
// "/userAgreementPage");
onTap: () {
Get.toNamed(
"/userPolicyPageNew",
arguments:
@@ -995,13 +989,7 @@ class RegisterPage extends GetView<MHTRegisterController> {
AlignmentDirectional(
0, 0),
child: InkWell(
onTap: () {
// showCustomConfirmOfWebViewDialog(
// context,
// "隐私协议",
// "/#/pages/agreement/agreement?type=1&hideHead=true");
// Get.toNamed(
// "/privacyPolicyPage");
onTap: () {
Get.toNamed(
"/privacyPolicyPageNew",
arguments:

View File

@@ -11,7 +11,9 @@ import 'package:vbvs_app/controller/user_info_controller.dart';
class PrivacyPolicyNewPage extends StatefulWidget {
var sleepUri;
PrivacyPolicyNewPage({super.key, required this.sleepUri});
bool showAppbar;
PrivacyPolicyNewPage(
{super.key, required this.sleepUri, this.showAppbar = true});
@override
State<PrivacyPolicyNewPage> createState() => _PrivacyPolicyNewPageState();
@@ -39,7 +41,7 @@ class _PrivacyPolicyNewPageState extends State<PrivacyPolicyNewPage> {
}
@override
Widget build(BuildContext context) {
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, bodySize) => GestureDetector(
// onTap: () => FocusScope.of(context).unfocus(),,
@@ -53,37 +55,40 @@ class _PrivacyPolicyNewPageState extends State<PrivacyPolicyNewPage> {
color: Colors.white,
child: Scaffold(
backgroundColor: Colors.transparent, // 背景透明
appBar: AppBar(
backgroundColor: themeController.currentColor.sc17,
automaticallyImplyLeading: false,
iconTheme: IconThemeData(color: themeController.currentColor.sc3),
titleSpacing: 0,
title: Container(
width: double.infinity,
height: 180.rpx,
child: Stack(
alignment: Alignment.center,
children: [
/// 居中标题
Text(
'隐私协议'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
letterSpacing: 0,
fontSize: 30.rpx,
appBar: (widget.showAppbar != null && widget.showAppbar == false)
? null
: AppBar(
backgroundColor: themeController.currentColor.sc17,
automaticallyImplyLeading: false,
iconTheme:
IconThemeData(color: themeController.currentColor.sc3),
titleSpacing: 0,
title: Container(
width: double.infinity,
height: 180.rpx,
child: Stack(
alignment: Alignment.center,
children: [
/// 居中标题
Text(
'隐私协议'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
letterSpacing: 0,
fontSize: 30.rpx,
),
),
/// 左边返回按钮
Positioned(
left: 0,
child: returnIconButtomNew(),
),
],
),
),
/// 左边返回按钮
Positioned(
left: 0,
child: returnIconButtomNew(),
),
],
),
),
),
),
body: SafeArea(
top: true,
child: Stack(