This commit is contained in:
czz
2025-06-27 09:15:45 +08:00
parent 12c6a260c9
commit 943f5a778a
36 changed files with 1850 additions and 1355 deletions

View File

@@ -12,159 +12,159 @@
"详情": "详情",
"人员资料": "人员资料"
},
"请输入手机号":"输入手机号码",
"请输入正确的手机号":"请输入正确的手机号",
"请输入密码":"请输入密码",
"密码格式提示":"1.密码长度必须至少8位\n2.密码需要字母加数字\n3.特殊字符和大写字母至少包含一个",
"请输入确认密码":"请输入确认密码",
"两次密码不一致":"两次密码不一致",
"请输入验证码":"请输入验证码",
"需要同意协议":"需要同意协议",
"请选择登录方式":"请选择登录方式",
"账户不能为空":"账户不能为空",
"密码不能为空":"密码不能为空",
"验证码不能为空":"验证码不能为空",
"密码登录":"密码登录",
"短信登录":"短信登录",
"获取验证码":"获取验证码",
"登录":"登录",
"找回密码":"找回密码",
"注册":"注册",
"我已阅读并同意":"我已阅读并同意",
"与":"与",
"《用户协议》":"《用户协议》",
"《隐私协议》":"《隐私协议》",
"注:首次登录会自动创建账号":"注:首次登录会自动创建账号",
"请输入新密码":"请输入新密码",
"确认新密码":"确认新密码",
"秒":"秒",
"添加一台新设备":"添加一台新设备",
"添加新设备":"添加新设备",
"网络未连接,请开启设备网络后重试":"网络未连接,请开启设备网络后重试",
"提交":"提交",
"发送验证码成功":"发送验证码成功",
"注册成功":"注册成功",
"再按一次退出程序":"再按一次退出程序成功",
"用户拒绝授权":"用户拒绝授权",
"用户取消授权":"用户取消授权",
"未命名":"未命名",
"编辑资料":"编辑资料",
"保存":"保存",
"点击更换头像":"点击更换头像",
"保存失败":"保存失败",
"昵称为空":"昵称为空",
"保存成功":"保存成功",
"请先登录":"请先登录",
"密码修改成功":"密码修改成功",
"未知数据":"-",
"必须登录提示":"请先登录!",
"输入验证码":"输入验证码",
"输入新密码":"输入新密码",
"确认验证码":"确认验证码",
"输入手机号码":"输入手机号码",
"操作成功":"操作成功",
"添加设备":"添加设备",
"扫描中":"扫描中...",
"检索设备":"检索设备",
"搜索":"搜索",
"匹配出的外围设备":"匹配出的外围设备",
"知道了":"知道了",
"蓝牙未开启":"蓝牙未开启",
"请先打开蓝牙在进行设备扫描":"请先打开蓝牙在进行设备扫描",
"等待扫描":"等待扫描",
"默认设备名称":"默认设备名称",
"连接异常":"连接异常",
"蓝牙绑定提示":"用手机进行设备添加时请打开手机蓝牙搜索靠近目标位置3米以内进行。",
"蓝牙连接成功":"蓝牙连接成功",
"蓝牙连接失败":"蓝牙连接失败,请重试",
"绑定失败请重试":"绑定失败请重试",
"无法绑定":"无法绑定!",
"无法绑定1":"检测到该设备",
"无法绑定2":"已被绑定",
"无法绑定3":",绑定前请先进行解绑,有疑问请联系客服",
"蓝牙绑定":{
"标题":"蓝牙绑定",
"扫描":"扫描蓝牙设备中…",
"信号":"最小信号强度",
"搜索提示":"检索设备",
"搜索":"搜索",
"匹配":"匹配出的外围设备",
"信号强度":"信号强度",
"SN":"SN",
"蓝牙地址":"蓝牙地址",
"mac":"mac",
"网络":"网络",
"在线":"在线",
"离线":"离线",
"版本":"版本",
"默认设备名称":"未知设备",
"传感器":"传感器",
"可绑定":"可绑定",
"已被绑定":"已被绑定",
"双人版绑定标题":"该设备为双人版,请选择",
"绑定全部":"绑定全部",
"主设备":"主设备:",
"从设备":"从设备:",
"确定":"确定",
"取消":"取消",
"无法绑定":"无法绑定!",
"无法绑定1":"检测到该设备",
"无法绑定2":"已被绑定",
"无法绑定3":",绑定前请先进行解绑,有疑问请联系客服",
"知道了":"知道了",
"是":"是",
"否":"否",
"确定绑定提示":"确定绑定该设备吗?",
"连接成功":"蓝牙连接成功",
"连接异常":"蓝牙连接异常",
"连接":"连接",
"输入wifi密码":"请输入wifi密码",
"显示密码":"显示",
"不显示密码":"不显示"
"请输入手机号": "输入手机号码",
"请输入正确的手机号": "请输入正确的手机号",
"请输入密码": "请输入密码",
"密码格式提示": "1.密码长度必须至少8位\n2.密码需要字母加数字\n3.特殊字符和大写字母至少包含一个",
"请输入确认密码": "请输入确认密码",
"两次密码不一致": "两次密码不一致",
"请输入验证码": "请输入验证码",
"需要同意协议": "需要同意协议",
"请选择登录方式": "请选择登录方式",
"账户不能为空": "账户不能为空",
"密码不能为空": "密码不能为空",
"验证码不能为空": "验证码不能为空",
"密码登录": "密码登录",
"短信登录": "短信登录",
"获取验证码": "获取验证码",
"登录": "登录",
"找回密码": "找回密码",
"注册": "注册",
"我已阅读并同意": "我已阅读并同意",
"与": "与",
"《用户协议》": "《用户协议》",
"《隐私协议》": "《隐私协议》",
"注:首次登录会自动创建账号": "注:首次登录会自动创建账号",
"请输入新密码": "请输入新密码",
"确认新密码": "确认新密码",
"秒": "秒",
"添加一台新设备": "添加一台新设备",
"添加新设备": "添加新设备",
"网络未连接,请开启设备网络后重试": "网络未连接,请开启设备网络后重试",
"提交": "提交",
"发送验证码成功": "发送验证码成功",
"注册成功": "注册成功",
"再按一次退出程序": "再按一次退出程序成功",
"用户拒绝授权": "用户拒绝授权",
"用户取消授权": "用户取消授权",
"未命名": "未命名",
"编辑资料": "编辑资料",
"保存": "保存",
"点击更换头像": "点击更换头像",
"保存失败": "保存失败",
"昵称为空": "昵称为空",
"保存成功": "保存成功",
"请先登录": "请先登录",
"密码修改成功": "密码修改成功",
"未知数据": "-",
"必须登录提示": "请先登录!",
"输入验证码": "输入验证码",
"输入新密码": "输入新密码",
"确认验证码": "确认验证码",
"输入手机号码": "输入手机号码",
"操作成功": "操作成功",
"添加设备": "添加设备",
"扫描中": "扫描中...",
"检索设备": "检索设备",
"搜索": "搜索",
"匹配出的外围设备": "匹配出的外围设备",
"知道了": "知道了",
"蓝牙未开启": "蓝牙未开启",
"请先打开蓝牙在进行设备扫描": "请先打开蓝牙在进行设备扫描",
"等待扫描": "等待扫描",
"默认设备名称": "默认设备名称",
"连接异常": "连接异常",
"蓝牙绑定提示": "用手机进行设备添加时请打开手机蓝牙搜索靠近目标位置3米以内进行。",
"蓝牙连接成功": "蓝牙连接成功",
"蓝牙连接失败": "蓝牙连接失败,请重试",
"绑定失败请重试": "绑定失败请重试",
"无法绑定": "无法绑定!",
"无法绑定1": "检测到该设备",
"无法绑定2": "已被绑定",
"无法绑定3": ",绑定前请先进行解绑,有疑问请联系客服",
"蓝牙绑定": {
"标题": "蓝牙绑定",
"扫描": "扫描蓝牙设备中…",
"信号": "最小信号强度",
"搜索提示": "检索设备",
"搜索": "搜索",
"匹配": "匹配出的外围设备",
"信号强度": "信号强度",
"SN": "SN",
"蓝牙地址": "蓝牙地址",
"mac": "mac",
"网络": "网络",
"在线": "在线",
"离线": "离线",
"版本": "版本",
"默认设备名称": "未知设备",
"传感器": "传感器",
"可绑定": "可绑定",
"已被绑定": "已被绑定",
"双人版绑定标题": "该设备为双人版,请选择",
"绑定全部": "绑定全部",
"主设备": "主设备:",
"从设备": "从设备:",
"确定": "确定",
"取消": "取消",
"无法绑定": "无法绑定!",
"无法绑定1": "检测到该设备",
"无法绑定2": "已被绑定",
"无法绑定3": ",绑定前请先进行解绑,有疑问请联系客服",
"知道了": "知道了",
"是": "是",
"否": "否",
"确定绑定提示": "确定绑定该设备吗?",
"连接成功": "蓝牙连接成功",
"连接异常": "蓝牙连接异常",
"连接": "连接",
"输入wifi密码": "请输入wifi密码",
"显示密码": "显示",
"不显示密码": "不显示"
},
"wifi页":{
"标题":"WIFI配置",
"跳过":"下一步",
"WLAN":"网络",
"未连接":"未连接",
"已连接":"已连接",
"可用WLAN":"可用WLAN",
"刷新":"刷新",
"密码为空":"密码不能为空",
"配网成功":"配网成功",
"配网失败":"配网失败",
"配网中":"配网中",
"需配网":"请给设备配置网络!"
"wifi页": {
"标题": "WIFI配置",
"跳过": "下一步",
"WLAN": "网络",
"未连接": "未连接",
"已连接": "已连接",
"可用WLAN": "可用WLAN",
"刷新": "刷新",
"密码为空": "密码不能为空",
"配网成功": "配网成功",
"配网失败": "配网失败",
"配网中": "配网中",
"需配网": "请给设备配置网络!"
},
"设备校准":"设备校准",
"离床校准":"离床校准",
"未完成":"未完成",
"已完成":"已完成",
"位置校准":"位置校准",
"床头":"床头",
"离床校准提示":"请校准人员暂时离开床铺且在校准期间保持周围安静",
"位置校准提示":"请校准人员到箭头指定一侧 平躺后点击开始保持10秒",
"开始校准":"开始校准",
"校准完成":"校准完成!",
"绑定成功":{
"标题":"绑定完成",
"绑定成功":"配置成功! ",
"分享标题":"是否进行分享?",
"分享内容":"设备绑定成功后,如需对朋友或家人共享我的睡眠情况,可以进行立即分享,分享成功后,对方即可享受查看该设备权限,可以收到该设备的睡眠报告。",
"立即分享":"立即分享",
"返回":"返回"
"设备校准": "设备校准",
"离床校准": "离床校准",
"未完成": "未完成",
"已完成": "已完成",
"位置校准": "位置校准",
"床头": "床头",
"离床校准提示": "请校准人员暂时离开床铺且在校准期间保持周围安静",
"位置校准提示": "请校准人员到箭头指定一侧 平躺后点击开始保持10秒",
"开始校准": "开始校准",
"校准完成": "校准完成!",
"绑定成功": {
"标题": "绑定完成",
"绑定成功": "配置成功! ",
"分享标题": "是否进行分享?",
"分享内容": "设备绑定成功后,如需对朋友或家人共享我的睡眠情况,可以进行立即分享,分享成功后,对方即可享受查看该设备权限,可以收到该设备的睡眠报告。",
"立即分享": "立即分享",
"返回": "返回"
},
"设置页":{
"标题":"设置",
"主题模式":"主题模式",
"选择语言":"选择语言",
"关于我们":"关于我们",
"用户协议":"用户协议",
"隐私协议":"隐私协议",
"退出登录":"退出登录",
"注销账号":"注销账号",
"退出成功":"退出成功",
"退出失败":"退出失败"
"设置页": {
"标题": "设置",
"主题模式": "主题模式",
"选择语言": "选择语言",
"关于我们": "关于我们",
"用户协议": "用户协议",
"隐私协议": "隐私协议",
"退出登录": "退出登录",
"注销账号": "注销账号",
"退出成功": "退出成功",
"退出失败": "退出失败"
},
"操作成功": "操作成功",
"关于我们": "关于我们",
@@ -172,7 +172,38 @@
"隐私协议": "隐私协议",
"退出登录": "退出登录",
"注销账号": "注销账号",
"我的智能设备":"我的智能设备",
"我的智能设备": "我的智能设备",
"解绑成功": "解绑成功",
"解绑失败": "解绑失败"
"解绑失败": "解绑失败",
"睡眠隐私": "睡眠隐私",
"睡眠隐私功能": "睡眠隐私功能",
"开始时间": "开始时间",
"结束时间": "结束时间",
"取消": "取消",
"确认": "确认",
"时": "时",
"分": "分",
"选择性别": "选择性别",
"*注:开启睡眠隐私功能后,在设置的时间段内,将不会采集您的睡眠数据。": "*注:开启睡眠隐私功能后,在设置时间段内,将不会采集您的睡眠数据。",
"柔性唤醒": "柔性唤醒",
"睡眠银色": "睡眠隐私",
"睡眠习惯": "睡眠习惯",
"允许对方查看设备": "允许对方查看设备",
"允许对方控制设备": "允许对方控制设备",
"已分享用户": "已分享用户",
"发送邀请": "发送邀请",
"仅允许对方查看该设备": "仅允许对方查看该设备",
"允许对方控制该设备": "允许对方控制该设备",
"点击复制APP下载链接": "点击复制APP下载链接",
"评价": "评价",
"我要评价": "我要评价",
"更新成功": "更新成功",
"更新失败": "更新失败",
"完成": "完成",
"请输入正确的联系人电话": "请输入正确的联系人电话",
"请选择体重": "请输入体重",
"请选择身高": "请输入身高",
"人员资料": "人员资料",
"请输入姓名": "请输入姓名"
}

View File

@@ -3,7 +3,7 @@ import 'dart:ui';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
class AppConstants {
class AppConstants {
// App-related constants
static const int code_time = 60; //验证码倒计时
static const int limit = 10; //分页数量

View File

@@ -12,6 +12,7 @@ MHDeviceShareModel _$MHDeviceShareModelFromJson(Map<String, dynamic> json) =>
..type = (json['type'] as num?)?.toInt()
..msg = json['msg'] as String?
..show = (json['show'] as num?)?.toInt()
..code = (json['code'] as num?)?.toInt()
..limit = (json['limit'] as num).toInt()
..offset = (json['offset'] as num).toInt()
..isLoading = json['isLoading'] as bool
@@ -21,10 +22,11 @@ MHDeviceShareModel _$MHDeviceShareModelFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> _$MHDeviceShareModelToJson(MHDeviceShareModel instance) =>
<String, dynamic>{
'phone': instance.account,
'account': instance.account,
'type': instance.type,
'msg': instance.msg,
'show': instance.show,
'code': instance.code,
'limit': instance.limit,
'offset': instance.offset,
'isLoading': instance.isLoading,

View File

@@ -39,7 +39,7 @@ class RepairListController extends GetControllerEx<RepairListModel> {
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.submit_repair;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
requestWithLog(
await requestWithLog(
logTitle: "查询报修数据",
method: MyHttpMethod.get,
queryUrl: queryUrl,

View File

@@ -12,9 +12,7 @@ RepairListModel _$RepairListModelFromJson(Map<String, dynamic> json) =>
..offset = (json['offset'] as num).toInt()
..isLoading = json['isLoading'] as bool
..hasMore = json['hasMore'] as bool
..repairList = (json['repairList'] as List<dynamic>)
.map((e) => ApplyRepairModel.fromJson(e as Map<String, dynamic>))
.toList();
..repairList = json['repairList'] as List<dynamic>;
Map<String, dynamic> _$RepairListModelToJson(RepairListModel instance) =>
<String, dynamic>{

View File

@@ -194,8 +194,6 @@ void initEasyDartModule() {
//初始化
}
Future<void> initLogin() async {
// 初始化控制器
Get.put(UserInfoController());
@@ -358,6 +356,7 @@ class MyApp extends StatelessWidget {
Get.lazyPut(() => MHTDeviceCalibrationController()),
Get.lazyPut(() => SleepReportController()),
Get.lazyPut(() => CalendarController()),
Get.lazyPut(() => UserPdfController()),
Get.put(WebviewTestController()),
]));
}

View File

@@ -714,13 +714,13 @@ Future showDayTimeSelectionDialog(
width: 100.rpx,
height: 60.rpx,
alignment: Alignment.center,
child: Text("取消",
child: Text("取消".tr,
style: TextStyle(
fontSize: 30.rpx, color: Colors.white)),
),
),
Text(
title,
title.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
@@ -742,7 +742,7 @@ Future showDayTimeSelectionDialog(
width: 100.rpx,
height: 60.rpx,
alignment: Alignment.center,
child: Text("确认",
child: Text("确认".tr,
style: TextStyle(
fontSize: 30.rpx, color: Colors.white)),
),
@@ -778,7 +778,7 @@ Future showDayTimeSelectionDialog(
context,
hours,
hoursIndex,
unit: "",
unit: "".tr,
),
),
Expanded(
@@ -786,7 +786,7 @@ Future showDayTimeSelectionDialog(
context,
minutes,
minutesIndex,
unit: "",
unit: "".tr,
),
),
],
@@ -856,12 +856,12 @@ Future showOneSelectionDialog(
alignment: Alignment.center,
width: 100.rpx,
height: 60.rpx,
child: Text("取消",
child: Text("取消".tr,
style: TextStyle(
fontSize: 30.rpx, color: Colors.white)),
),
),
Text(title,
Text(title.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
@@ -879,7 +879,7 @@ Future showOneSelectionDialog(
alignment: Alignment.center,
width: 100.rpx,
height: 60.rpx,
child: Text("确认",
child: Text("确认".tr,
style: TextStyle(
fontSize: 30.rpx, color: Colors.white)),
),

View File

@@ -17,35 +17,6 @@ class MattressControlPage extends StatefulWidget {
class _MattressControlPageState extends State<MattressControlPage> {
final controller = Get.put(ControlCardController());
final data = {
"_id": "333330000000000000000000",
"uid": "684b90df767e00004e0072e2",
"bind_type": 1,
"device_type": 3,
"mac": "545024122666",
"bind_mac": null,
"bind_mac_a": "B43A45C3D411",
"bind_mac_b": "B43A45C3D388",
"position": 0,
"share_uid": null,
"person": null,
"op_type": null,
"show": true,
"create_time": 1750121686274,
"room_id": "684395bf9ef8601da20f6475",
"roomName": "主卧",
"shareNum": 0,
"status": {
"signal": -1,
"status": 0,
"inBed": 0,
"upgrade": 0,
"failure": 0,
"updateTime": -1
},
"code": "545024122666",
"blueToothStatus": 1
};
int selectedIndex = 1; // 当前选中的tab索引
@override
Widget build(BuildContext context) {
@@ -138,10 +109,10 @@ class _MattressControlPageState extends State<MattressControlPage> {
body: SafeArea(
child: WebviewTestView(
// oncreate: (widget) {
// return WebviewTestController();
// },
),
// oncreate: (widget) {
// return WebviewTestController();
// },
),
),
))));
}

View File

@@ -78,9 +78,9 @@ class ShareUserWidget extends GetView {
alignment: const AlignmentDirectional(-1, 0),
child: Text(
info['opType'] == 1
? '允许对方控制该设备'
? '允许对方控制该设备'.tr
: info['opType'] == 2
? '仅允许对方查看该设备'
? '仅允许对方查看该设备'.tr
: '',
style: TextStyle(
fontFamily: 'Readex Pro',

View File

@@ -0,0 +1,128 @@
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/tool/WebViewWidget.dart';
class MhAboutUsPage extends StatefulWidget {
late MyWebView webView;
MhAboutUsPage({super.key});
@override
State<MhAboutUsPage> createState() => _MhAboutUsPageState();
}
class _MhAboutUsPageState extends State<MhAboutUsPage> {
@override
void initState() {
super.initState();
// pdfController.loadPdf();
widget.webView = MyWebView(
url: AppConstants().ent_type == 1
? "https://mp.weixin.qq.com/s/IAr4RNBy0hGJXGKyMxe7eQ"
: "https://mp.weixin.qq.com/s/7BvvprVDqX1eOzM3Lms8dg",
onLoad: () {
print('网页载入完毕');
},
);
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, bodySize) => GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/new_background.png'), // 本地图片
fit: BoxFit.fill, // 填满整个 Container
),
),
child: Scaffold(
backgroundColor: Colors.transparent, // 加上这一行
appBar: AppBar(
backgroundColor: Colors.transparent,
// backgroundColor: Colors.transparent,
automaticallyImplyLeading: false,
iconTheme: IconThemeData(color: themeController.currentColor.sc3),
titleSpacing: 0,
// leading: returnIconButtom,
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: 20,
child: returnIconButtomNew,
),
],
),
),
actions: [],
centerTitle: false,
),
// body: SafeArea(
// top: true,
// child: Padding(
// padding: EdgeInsets.symmetric(horizontal: 30.rpx),
// child: Column(
// children: [
// Expanded(
// child: Obx(() {
// if (pdfController.localPdfPath.value == null) {
// return Center(child: CircularProgressIndicator());
// } else {
// return PDFView(
// filePath: pdfController.localPdfPath.value!,
// autoSpacing: false,
// enableSwipe: true,
// swipeHorizontal: false,
// pageSnap: true,
// fitEachPage: true,
// defaultPage: 0,
// onRender: (pages) => print('PDF 渲染完成,共 $pages 页'),
// onError: (error) => print('PDF 加载错误: $error'),
// );
// }
// }),
// ),
// ],
// ),
// ),
// ),
body: SafeArea(
top: true,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 0.rpx),
child: Column(children: [
Expanded(
child: Container(
child: widget.webView,
),
),
]),
),
),
),
),
),
);
}
}

View File

@@ -71,37 +71,76 @@ class AddressListPage extends GetView<AddressListController> {
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
// Obx(() {
// if (controller.model.addressList!.isEmpty) {
// // 如果地址列表为空,显示 EmptyMessageWidget
// return Expanded(child: NullDataWidget());
// } else {
// // 如果地址列表不为空,显示地址列表
// return Expanded(
// child: Container(
// width: bodysize!.maxWidth,
// height: bodysize!.maxHeight * 1,
// decoration: BoxDecoration(),
// child: Obx(() => ListView(
// shrinkWrap: true,
// scrollDirection: Axis.vertical,
// children: (controller.model.addressList!
// .asMap()
// .entries
// .map((e) => AddressModuleWidget(
// index: e.key,
// addressListController:
// controller,
// ))
// .toList() as List<Widget>)
// .divide(const SizedBox(height: 10))
// .addToEnd(const SizedBox(
// height:
// AppConstants.list_end_height)),
// )),
// ),
// );
// }
// }),
Obx(() {
if (controller.model.addressList!.isEmpty) {
// 如果地址列表为空,显示 EmptyMessageWidget
return Expanded(child: NullDataWidget());
} else {
// 如果地址列表不为空,显示地址列表
return Expanded(
child: Container(
width: bodysize!.maxWidth,
height: bodysize!.maxHeight * 1,
decoration: BoxDecoration(),
child: Obx(() => ListView(
shrinkWrap: true,
scrollDirection: Axis.vertical,
children: (controller.model.addressList!
.asMap()
.entries
.map((e) => AddressModuleWidget(
index: e.key,
addressListController:
controller,
))
.toList() as List<Widget>)
.divide(const SizedBox(height: 10))
.addToEnd(const SizedBox(
height:
AppConstants.list_end_height)),
)),
),
);
}
final originList = controller.model.addressList ?? [];
// 拆出默认地址
final defaultItem = originList.firstWhere(
(e) => e["default"] == 1,
orElse: () => null,
);
// 其他非默认地址
final others =
originList.where((e) => e["default"] != 1).toList();
// 新的展示顺序列表(默认地址排前面)
final reorderedList = [
if (defaultItem != null) defaultItem,
...others,
];
return Expanded(
child: ListView(
shrinkWrap: true,
padding: EdgeInsets.zero,
children: reorderedList
.map((item) {
final realIndex =
originList.indexOf(item); // 保留原始 index
return AddressModuleWidget(
index: realIndex,
addressListController: controller,
);
})
.toList()
.divide(const SizedBox(height: 10))
.addToEnd(const SizedBox(
height: AppConstants.list_end_height)),
),
);
}),
Align(
alignment: AlignmentDirectional(0, 1),

View File

@@ -1168,90 +1168,100 @@ class ApplyRepairPage extends GetView<ApplyRepairController> {
child:
TextFormField(
// autofocus: true,
obscureText:
false,
onChanged:
(value) {
(val) {
controller
.model
.apply_name =
value;
val;
},
obscureText:
false,
decoration:
InputDecoration(
isDense: true,
contentPadding:
EdgeInsets
.symmetric(
vertical:
25.rpx,
horizontal:
26.rpx,
),
labelStyle:
const TextStyle(
TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
),
hintStyle:
const TextStyle(
TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
),
enabledBorder:
OutlineInputBorder(
UnderlineInputBorder(
borderSide:
BorderSide(
color: const Color(
const BorderSide(
color: Color(
0x00000000),
width:
1.rpx,
width: 2,
),
borderRadius:
BorderRadius.circular(
AppConstants().normal_container_radius),
BorderRadius
.circular(8),
),
focusedBorder:
OutlineInputBorder(
UnderlineInputBorder(
borderSide:
BorderSide(
color: Colors
.transparent,
width:
1.rpx,
const BorderSide(
color: Color(
0x00000000),
width: 2,
),
borderRadius:
BorderRadius.circular(
8.rpx),
BorderRadius
.circular(8),
),
errorBorder:
OutlineInputBorder(
UnderlineInputBorder(
borderSide:
BorderSide(
//
width:
1.rpx,
const BorderSide(
color: Color(
0x00000000),
width: 2,
),
borderRadius:
BorderRadius.circular(
8.rpx),
BorderRadius
.circular(8),
),
focusedErrorBorder:
OutlineInputBorder(
UnderlineInputBorder(
borderSide:
BorderSide(
//
width:
1.rpx,
const BorderSide(
color: Color(
0x00000000),
width: 2,
),
borderRadius:
BorderRadius.circular(
8.rpx),
BorderRadius
.circular(8),
),
),
style: TextStyle(
letterSpacing:
0,
color: Colors
.black,
fontSize:
26.rpx),
style:
TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
color: Colors
.black,
fontSize:
26.rpx,
),
),
),
),
@@ -1324,90 +1334,100 @@ class ApplyRepairPage extends GetView<ApplyRepairController> {
child:
TextFormField(
// autofocus: true,
obscureText:
false,
onChanged:
(value) {
(val) {
controller
.model
.tel =
value;
val;
},
obscureText:
false,
decoration:
InputDecoration(
isDense: true,
contentPadding:
EdgeInsets
.symmetric(
vertical:
25.rpx,
horizontal:
26.rpx,
),
labelStyle:
const TextStyle(
TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
),
hintStyle:
const TextStyle(
TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
),
enabledBorder:
OutlineInputBorder(
UnderlineInputBorder(
borderSide:
BorderSide(
color: const Color(
const BorderSide(
color: Color(
0x00000000),
width:
1.rpx,
width: 2,
),
borderRadius:
BorderRadius.circular(
AppConstants().normal_container_radius),
BorderRadius
.circular(8),
),
focusedBorder:
OutlineInputBorder(
UnderlineInputBorder(
borderSide:
BorderSide(
color: Colors
.transparent,
width:
1.rpx,
const BorderSide(
color: Color(
0x00000000),
width: 2,
),
borderRadius:
BorderRadius.circular(
8.rpx),
BorderRadius
.circular(8),
),
errorBorder:
OutlineInputBorder(
UnderlineInputBorder(
borderSide:
BorderSide(
//
width:
1.rpx,
const BorderSide(
color: Color(
0x00000000),
width: 2,
),
borderRadius:
BorderRadius.circular(
8.rpx),
BorderRadius
.circular(8),
),
focusedErrorBorder:
OutlineInputBorder(
UnderlineInputBorder(
borderSide:
BorderSide(
//
width:
1.rpx,
const BorderSide(
color: Color(
0x00000000),
width: 2,
),
borderRadius:
BorderRadius.circular(
8.rpx),
BorderRadius
.circular(8),
),
),
style: TextStyle(
letterSpacing:
0,
color: Colors
.black,
fontSize:
26.rpx),
style:
TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
color: Colors
.black,
fontSize:
26.rpx,
),
),
),
),

View File

@@ -4,16 +4,13 @@ import 'package:flutter/services.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/color/app_uri_status.dart';
import 'package:vbvs_app/common/util/CommonVariables.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/mh_controller/mhdevice_share_controller.dart';
import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/pages/mh_page/EmptyMessageWidget.dart';
import 'package:vbvs_app/pages/mh_page/ShareUserWidget.dart';
class ShareDeviceWidget extends GetView<MHDeviceShareController> {
@@ -216,125 +213,280 @@ class ShareDeviceWidget extends GetView<MHDeviceShareController> {
),
),
)),
Obx(
() => GestureDetector(
onTap: () {
// 当点击时,将 type 设置为 0允许控制
controller.model.type = 1;
controller.updateAll();
},
child: Container(
margin: EdgeInsets.only(top: 76.rpx),
width: MediaQuery.sizeOf(context).width,
constraints: const BoxConstraints(
minHeight: 46,
),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(0),
),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'允许对方控制该设备',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0.0,
),
GestureDetector(
onTap: () {
// 当点击时,将 type 设置为 0允许控制
controller.model.type = 1;
controller.updateAll();
},
child: Container(
margin: EdgeInsets.only(top: 76.rpx),
width: MediaQuery.sizeOf(context).width,
constraints: const BoxConstraints(
minHeight: 46,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(0),
),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'允许对方控制该设备'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0.0,
),
Theme(
data:
Theme.of(context).copyWith(
unselectedWidgetColor: Color(
0xFFC8CBD2), // 改变未选中状态边框颜色
),
Obx(() {
double h = 33.rpx;
bool check =
controller.model.type == 1;
return Container(
height: 33.rpx,
child: AspectRatio(
aspectRatio: 1,
child: Center(
child: Container(
height: h,
width: h,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(
h / 2),
border: Border.all(
width: check ? 1 : 0.5,
color:
Color(0xFFC8CBD2),
),
),
child: check
? Center(
child: ClipOval(
child: Container(
width: h * 0.6,
height: h * 0.6,
color: const Color(
0xFF6BFDAC),
),
),
)
: null,
),
),
child: Radio<int>(
value: 1,
groupValue:
controller.model.type,
onChanged: (value) {
controller.model.type =
value!;
controller.updateAll();
},
activeColor:
const Color(0xFF6BFDAC),
materialTapTargetSize:
MaterialTapTargetSize
.shrinkWrap, // 减少内边距
visualDensity: VisualDensity(
horizontal: -4,
vertical: -4), // 缩小视觉密度
))
],
),
),
);
}),
],
),
),
),
Obx(
() => GestureDetector(
onTap: () {
// 当点击时,将 type 设置为 1仅允许查看
controller.model.type = 2;
controller.updateAll();
},
child: Container(
width: MediaQuery.sizeOf(context).width,
constraints: const BoxConstraints(
minHeight: 46,
),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(0),
),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'仅允许对方查看该设备',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0.0,
),
// Obx(
// () => GestureDetector(
// onTap: () {
// controller.model.type = 2;
// controller.updateAll();
// },
// child: Container(
// width: MediaQuery.sizeOf(context).width,
// constraints: const BoxConstraints(
// minHeight: 46,
// ),
// decoration: BoxDecoration(
// borderRadius:
// BorderRadius.circular(0),
// ),
// child: Row(
// mainAxisSize: MainAxisSize.max,
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// Text(
// '仅允许对方查看该设备'.tr,
// style: TextStyle(
// fontFamily: 'Readex Pro',
// color: Colors.white,
// fontSize: 26.rpx,
// letterSpacing: 0.0,
// ),
// ),
// // Theme(
// // data:
// // Theme.of(context).copyWith(
// // unselectedWidgetColor: Color(
// // 0xFFC8CBD2), // 改变未选中状态边框颜色
// // ),
// // child: Radio<int>(
// // value: 2,
// // groupValue:
// // controller.model.type,
// // onChanged: (value) {
// // controller.model.type =
// // value!;
// // controller.updateAll();
// // },
// // activeColor:
// // const Color(0xFF6BFDAC),
// // materialTapTargetSize:
// // MaterialTapTargetSize
// // .shrinkWrap, // 减少内边距
// // visualDensity: VisualDensity(
// // horizontal: -4,
// // vertical: -4), // 缩小视觉密度
// // ))
// ClipOval(
// child: Container(
// height:
// MediaQuery.sizeOf(context)
// .height *
// 0.0449,
// child: AspectRatio(
// aspectRatio: 1,
// child: Center(
// child: LayoutBuilder(
// builder: (context,
// constraints) {
// double h =
// MediaQuery.sizeOf(
// context)
// .height *
// 0.0326;
// bool check = controller
// .model.type ==
// 2;
// if (check) {
// return Container(
// height: h,
// width: h,
// decoration:
// BoxDecoration(
// borderRadius:
// BorderRadius
// .circular(
// h / 2),
// border: Border.all(
// width: 1,
// color: Color(
// 0xFF6BFDAC)),
// ),
// child: Center(
// child: ClipOval(
// child: Container(
// width:
// h * 0.6,
// height:
// h * 0.6,
// color: Color(
// 0xFF6BFDAC)),
// ),
// ),
// );
// } else {
// return Container(
// height: h,
// width: h,
// decoration:
// BoxDecoration(
// borderRadius:
// BorderRadius
// .circular(
// h / 2),
// border: Border.all(
// width: 0.5,
// color: Colors
// .white),
// ),
// );
// }
// },
// ),
// ),
// ),
// ),
// ),
// ],
// ),
// ),
// ),
// ),
GestureDetector(
onTap: () {
controller.model.type = 2;
controller.updateAll();
},
child: Container(
width: MediaQuery.sizeOf(context).width,
constraints:
const BoxConstraints(minHeight: 46),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(0),
),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'仅允许对方查看该设备'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0.0,
),
Theme(
data:
Theme.of(context).copyWith(
unselectedWidgetColor: Color(
0xFFC8CBD2), // 改变未选中状态边框颜色
),
// ✅ 只包住响应式控件部分
Obx(() {
double h = 33.rpx;
bool check =
controller.model.type == 2;
return Container(
height: 33.rpx,
child: AspectRatio(
aspectRatio: 1,
child: Center(
child: Container(
height: h,
width: h,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(
h / 2),
border: Border.all(
width: check ? 1 : 0.5,
color:
Color(0xFFC8CBD2),
),
),
child: check
? Center(
child: ClipOval(
child: Container(
width: h * 0.6,
height: h * 0.6,
color: const Color(
0xFF6BFDAC),
),
),
)
: null,
),
),
child: Radio<int>(
value: 2,
groupValue:
controller.model.type,
onChanged: (value) {
controller.model.type =
value!;
controller.updateAll();
},
activeColor:
const Color(0xFF6BFDAC),
materialTapTargetSize:
MaterialTapTargetSize
.shrinkWrap, // 减少内边距
visualDensity: VisualDensity(
horizontal: -4,
vertical: -4), // 缩小视觉密度
))
],
),
),
);
}),
],
),
),
),
Align(
alignment: const AlignmentDirectional(0, 0),
child: Padding(
@@ -361,7 +513,7 @@ class ShareDeviceWidget extends GetView<MHDeviceShareController> {
.currentColor.sc9);
}
},
text: '发送邀请',
text: '发送邀请'.tr,
options: FFButtonOptions(
height: 60.rpx,
padding:
@@ -404,7 +556,7 @@ class ShareDeviceWidget extends GetView<MHDeviceShareController> {
padding: const EdgeInsetsDirectional
.fromSTEB(14, 0, 0, 16),
child: Text(
'已分享用户',
'已分享用户'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,

View File

@@ -2,6 +2,7 @@ import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter_city_picker/listener/picker_listener.dart';
import 'package:flutter_city_picker/model/address.dart';
import 'package:flutter_svg/svg.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
@@ -739,6 +740,158 @@ class EditAddressPage extends GetView<AddressController>
],
),
),
// Expanded(
// child: InkWell(
// onTap: () {
// CityPicker.show(
// context:
// context,
// cityPickerListener:
// this,
// // 在大屏/Web 上最大宽度为 600px
// // 移除内边距
// );
// },
// child: Container(
// width: 100,
// height: 100,
// decoration:
// BoxDecoration(
// color: const Color(
// 0xFFF3F5F6),
// borderRadius:
// BorderRadius
// .circular(
// 8),
// ),
// alignment:
// Alignment
// .center,
// child: Obx(() {
// return TextFormField(
// enabled:
// false,
// controller: controller.onReDraw(
// TextEditingController(
// text:
// controller.model.all_address),
// (val) {
// val.text =
// controller.model.all_address ??
// "";
// }),
// // autofocus: true,
// obscureText:
// false,
// maxLines: 1,
// textAlignVertical:
// TextAlignVertical
// .center, // 垂直居中
// decoration: InputDecoration(
// contentPadding: EdgeInsets.symmetric(
// vertical:
// 25.rpx,
// horizontal:
// 26.rpx,
// ),
// labelStyle: TextStyle(
// fontFamily:
// 'Readex Pro',
// letterSpacing:
// 0,
// ),
// hintStyle: TextStyle(
// fontFamily:
// 'Readex Pro',
// letterSpacing:
// 0,
// ),
// enabledBorder: UnderlineInputBorder(
// borderSide:
// const BorderSide(
// color:
// Color(0x00000000),
// width:
// 2,
// ),
// borderRadius:
// BorderRadius.circular(8),
// ),
// disabledBorder: UnderlineInputBorder(
// borderSide:
// const BorderSide(
// color:
// Color(0x00000000),
// width:
// 0,
// ),
// borderRadius:
// BorderRadius.circular(8),
// ),
// focusedBorder: UnderlineInputBorder(
// borderSide:
// const BorderSide(
// color:
// Color(0x00000000),
// width:
// 2,
// ),
// borderRadius:
// BorderRadius.circular(8),
// ),
// errorBorder: UnderlineInputBorder(
// borderSide:
// const BorderSide(
// color:
// Color(0x00000000),
// width:
// 2,
// ),
// borderRadius:
// BorderRadius.circular(8),
// ),
// focusedErrorBorder: UnderlineInputBorder(
// borderSide:
// const BorderSide(
// color:
// Color(0x00000000),
// width:
// 2,
// ),
// borderRadius:
// BorderRadius.circular(8),
// ),
// suffixIcon: Transform.rotate(
// angle:
// 1.5708, // 90 度相当于 pi / 2 弧度
// child:
// Icon(
// Icons.arrow_forward_ios,
// color:
// Colors.black,
// size:
// 26.rpx,
// ),
// )),
// style:
// TextStyle(
// fontFamily:
// 'Readex Pro',
// letterSpacing:
// 0,
// color: Color(
// 0xFF333333),
// fontSize:
// 26.rpx,
// overflow:
// TextOverflow
// .ellipsis,
// ),
// );
// })),
// ),
// ),
Expanded(
child: InkWell(
onTap: () {
@@ -747,148 +900,71 @@ class EditAddressPage extends GetView<AddressController>
context,
cityPickerListener:
this,
// 在大屏/Web 上最大宽度为 600px
// 移除内边距
);
},
child: Container(
width: 100,
height: 100,
decoration:
BoxDecoration(
color: const Color(
0xFFF3F5F6),
borderRadius:
BorderRadius
.circular(
8),
),
alignment:
Alignment
.center,
child: Obx(() {
return TextFormField(
enabled:
false,
controller: controller.onReDraw(
TextEditingController(
text:
controller.model.all_address),
(val) {
val.text =
controller.model.all_address ??
"";
}),
// autofocus: true,
obscureText:
false,
textAlignVertical:
TextAlignVertical
.center, // 垂直居中
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
vertical:
25.rpx,
horizontal:
width: 100,
height: 100,
decoration:
BoxDecoration(
color: const Color(
0xFFF3F5F6),
borderRadius:
BorderRadius
.circular(
8),
),
alignment:
Alignment
.center,
child: Obx(() {
return Row(
children: [
Expanded(
child:
Padding(
padding: EdgeInsets.only(
left: 27
.rpx,
right:
10.rpx),
child:
Text(
controller.model.all_address ??
'',
maxLines:
1,
overflow:
TextOverflow.ellipsis,
style:
TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
color:
Color(0xFF333333),
fontSize:
26.rpx,
),
labelStyle: TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
),
hintStyle: TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
),
enabledBorder: UnderlineInputBorder(
borderSide:
const BorderSide(
color:
Color(0x00000000),
width:
2,
),
borderRadius:
BorderRadius.circular(8),
),
disabledBorder: UnderlineInputBorder(
borderSide:
const BorderSide(
color:
Color(0x00000000),
width:
0,
),
borderRadius:
BorderRadius.circular(8),
),
focusedBorder: UnderlineInputBorder(
borderSide:
const BorderSide(
color:
Color(0x00000000),
width:
2,
),
borderRadius:
BorderRadius.circular(8),
),
errorBorder: UnderlineInputBorder(
borderSide:
const BorderSide(
color:
Color(0x00000000),
width:
2,
),
borderRadius:
BorderRadius.circular(8),
),
focusedErrorBorder: UnderlineInputBorder(
borderSide:
const BorderSide(
color:
Color(0x00000000),
width:
2,
),
borderRadius:
BorderRadius.circular(8),
),
suffixIcon: Transform.rotate(
angle:
1.5708, // 90 度相当于 pi / 2 弧度
child:
Icon(
Icons.arrow_forward_ios,
color:
Colors.black,
size:
26.rpx,
),
)),
style:
TextStyle(
fontFamily:
'Readex Pro',
letterSpacing:
0,
color: Color(
0xFF333333),
fontSize:
26.rpx,
overflow:
TextOverflow
.ellipsis,
),
);
})),
),
)),
Padding(
padding:
EdgeInsets.only(right: 27.rpx),
child: Container(
height: 30.rpx,
width: 30.rpx,
child: SvgPicture.asset(
'assets/img/icon/expand_more.svg',
color: Colors.black,
)))
],
);
}),
),
),
),
)
].divide(const SizedBox(
width: 15)),
),

View File

@@ -6,6 +6,7 @@ import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/mh_controller/device_list_controller.dart';
class EditBedPage extends StatefulWidget {
final Map data;
@@ -19,6 +20,7 @@ BoxConstraints? bodysize;
class _EditBedPageState extends State<EditBedPage> {
late Map<String, dynamic> editedData;
late TextEditingController _nameController; //名称文本输入框
DeviceListController deviceListController = Get.find();
@override
void initState() {
super.initState();
@@ -205,6 +207,7 @@ class _EditBedPageState extends State<EditBedPage> {
onSuccess: (res) {
TopSlideNotification.show(context,
text: "修改名称成功".tr);
deviceListController.getDeviceList();
},
);
},
@@ -222,7 +225,7 @@ class _EditBedPageState extends State<EditBedPage> {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
),
child: Text("完成",
child: Text("完成".tr,
style: TextStyle(
color: const Color(0xFF003058),
fontSize: 26.rpx)),

View File

@@ -11,6 +11,7 @@ import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/mh_controller/experience_store_list_page.dart';
import 'package:vbvs_app/controller/weather/weather_controller.dart';
import 'package:vbvs_app/pages/mh_page/Empty.dart';
@@ -104,7 +105,9 @@ class _ExperienceStorePageState extends State<ExperienceStorePage> {
highlightColor: Color(0xFF055466),
padding: EdgeInsets.only(left: 0),
onTap: () {
Get.toNamed("/myExperiencePage");
TopSlideNotification.show(context,
text: "待开发功能".tr);
// Get.toNamed("/myExperiencePage");
},
child: SvgPicture.asset(
'assets/img/icon/history_store.svg',

View File

@@ -2,177 +2,116 @@ import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:vbvs_app/common/color/appColors.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
class HelpArticle extends StatelessWidget {
Map article;
class HelpArticle extends StatefulWidget {
final Map article;
HelpArticle({super.key, required this.article});
// get articleController => Get.find<ArticleController>();
get userInfoController => Get.find<UserInfoController>();
@override
State<HelpArticle> createState() => _HelpArticleState();
}
var isLike = 0.obs;
// @override
// Widget build(BuildContext context) {
// String top_imgOrVideo = "";
// if (article['imgOrVideo'] == 0) {
// top_imgOrVideo =
// '''<img class="video" src="${getStorageResourceUrl(article['coverUrl'])}" />''';
// } else {
// top_imgOrVideo =
// '''<video controls class="video" src="${getStorageResourceUrl(article['videoUrl'])}" ></video>''';
// }
// String newText = article['text'];
// RegExp("<img\\s*src=\"([^\"]*)\"")
// .allMatches(newText)
// .toList()
// .map((d) => d.group(1))
// .toList()
// .forEach((d) {
// newText = newText.replaceAll("$d", getStorageResourceUrl("$d"));
// });
// String html = '''
// <html>
// <meta name="viewport" charset="UTF-8"
// content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
// <head>
// <title>Test Page</title>
// </head>
// <style>
// body {
// width: 98%;
// margin: 0 auto;
// overflow-x: hidden;
// }
// .video {
// width: 100%;
// height: 270px;
// background-color: #9EA4B7;
// border-radius: 6px;
// }
// </style>
// <body>
// <div style="padding: 15px;width: calc(100% - 36px);">
// ${top_imgOrVideo}
// <div style="height: 2px;width: 100%;background-color: #D6D6D6;margin: 15px 0 15px 0;"></div>
// <div style="line-height: 22px;font-size: 15px;">${article['title']}</div>
// <div style="display: flex;align-items: center;font-size: 13;margin-bottom: 24px;margin-top: 10px;">
// <div style="color: #182B7C;">${article['author']}</div>
// <div style="margin-left: 13px; color: #D3D3D3;">${time_08_Formatter(article['created_at'])}</div>
// </div>
// ${newText}
// </div>
// </body>
// </html>
// ''';
// print("$html");
// // articleController.readAdd(article['id']);
// String? uid = userInfoController.model.user?.uid;
// print("${userInfoController.model.user}");
// // uid = "sss";
// // if (uid != null) {
// // articleController.findIsLike(uid, article['id']).then((d) {
// // isLike.value = d;
// // });
// // }
// return LayoutBuilder(
// builder: (context, boxConstraints) => GestureDetector(
// onTap: () => FocusScope.of(context).unfocus(),
// child: Scaffold(
// appBar: AppBar(
// backgroundColor: AppColors.bg_color,
// automaticallyImplyLeading: false,
// iconTheme: IconThemeData(color: Colors.white),
// titleSpacing: 0,
// leading: returnIconButtom,
// ),
// body: SafeArea(
// top: true,
// child: Container(
// width: MediaQuery.sizeOf(context).width,
// height: MediaQuery.sizeOf(context).height,
// decoration: BoxDecoration(
// color: Colors.white,
// // color: AppColors.bg_color,
// // image: DecorationImage(
// // image: AssetImage("assets/images/background.png$test"),
// // fit: BoxFit.cover,
// // ),
// ),
// child: Column(
// children: [
// Expanded(
// child: Container(
// // child: WebViewWidget(
// // controller: WebViewController()
// // ..setJavaScriptMode(JavaScriptMode.unrestricted)
// // ..loadHtmlString(html),
// // ),
// child: InAppWebView(
// initialData:
// InAppWebViewInitialData(data: html, encoding: ""),
// ),
// ),
// ),
// ],
// ),
// ),
// ),
// ),
// ),
// );
// }
class _HelpArticleState extends State<HelpArticle> {
bool isLoading = true;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFF042C46),
appBar: AppBar(
backgroundColor: const Color(0xFF042C46),
title: Text("问题与帮助", style: TextStyle(color: Colors.white)),
centerTitle: true,
leading: IconButton(
icon: Icon(Icons.arrow_back, color: Colors.white),
onPressed: () => Navigator.pop(context),
return Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/new_background.png'), // 本地图片
fit: BoxFit.fill, // 填满整个 Container
),
),
elevation: 0,
),
body: Column(
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
alignment: Alignment.centerLeft,
child: Text(
article['title'],
style: const TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold),
),
),
Expanded(
child: InAppWebView(
initialData: InAppWebViewInitialData(
data: wrapHtml(article['content']),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: AppBar(
backgroundColor: Colors.transparent,
automaticallyImplyLeading: false,
iconTheme: IconThemeData(color: Colors.white),
titleSpacing: 0,
title: SizedBox(
width: double.infinity,
height: 180.rpx,
child: Stack(
alignment: Alignment.center,
children: [
// 中间居中的标题
Text(
'问题与帮助',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 30.rpx,
),
),
// 左侧图标
Positioned(
left: 20.rpx,
child: returnIconButtomNew,
),
],
),
),
actions: [],
centerTitle: false,
),
),
],
),
);
body: Padding(
padding: EdgeInsets.only(left: 30.rpx, right: 30.rpx),
child: Column(
children: [
Container(
padding: EdgeInsets.only(
left: 26.rpx, top: 53.rpx, bottom: 15.rpx),
alignment: Alignment.centerLeft,
child: Text(
widget.article['title'],
style: TextStyle(
color: Colors.white,
fontSize: 30.rpx,
),
),
),
Divider(
color: Color(0XFF929699),
thickness: 0.5.rpx,
),
Expanded(
child: Stack(
children: [
InAppWebView(
initialData: InAppWebViewInitialData(
data: wrapHtml(widget.article['content']),
),
initialSettings: InAppWebViewSettings(
transparentBackground: true,
),
onLoadStop: (controller, url) {
setState(() {
isLoading = false;
});
},
),
if (isLoading)
Container(
color: const Color(0xFF042C46),
alignment: Alignment.center,
child: const CircularProgressIndicator(
valueColor:
AlwaysStoppedAnimation<Color>(Colors.white),
),
),
],
),
),
],
),
)));
}
/// 包装成完整 HTML 页面,添加适配样式
String wrapHtml(String htmlContent) {
return """
<!DOCTYPE html>
@@ -182,11 +121,12 @@ class HelpArticle extends StatelessWidget {
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
color: #FFFFFF;
background-color: #042C46;
color: #929699;
background-color: transparent;
font-family: sans-serif;
padding: 16px;
font-size: 16px;
padding: 0;
font-size: 18;
}
p, li {
line-height: 1.6;

View File

@@ -515,6 +515,7 @@ class _NewHomePageState extends State<NewHomePage> {
isMultiSelect: false,
),
),
),
InkWell(
onTap: () {

View File

@@ -141,7 +141,7 @@ class _MinePageState extends State<NewMinePage> {
userInfoController
.model.user!.avatar!.isEmpty
? Image.asset(
"assets/images/people_avatar.png",
"assets/images/default_avatar.png",
fit: BoxFit.cover,
)
: Image.network(
@@ -149,7 +149,7 @@ class _MinePageState extends State<NewMinePage> {
fit: BoxFit.cover,
))
: Image.asset(
"assets/images/people_avatar.png",
"assets/images/default_avatar.png",
fit: BoxFit.cover,
),
),

View File

@@ -288,7 +288,9 @@ class _SettingPageState extends State<SettingPage> {
.currentColor.sc21, // 点击时的背景色
padding: EdgeInsetsDirectional.fromSTEB(
0.rpx, 0.rpx, 0.rpx, 0.rpx),
onTap: () {},
onTap: () {
Get.toNamed('/aboutUs');
},
child: Container(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
@@ -335,8 +337,7 @@ class _SettingPageState extends State<SettingPage> {
padding: EdgeInsetsDirectional.fromSTEB(
40.rpx, 0.rpx, 40.rpx, 0.rpx),
onTap: () {
TopSlideNotification.show(context,
text: "待开发功能".tr);
Get.toNamed("/userAgreementPage");
},
child: Container(
child: Padding(
@@ -384,8 +385,7 @@ class _SettingPageState extends State<SettingPage> {
padding: EdgeInsetsDirectional.fromSTEB(
0.rpx, 0.rpx, 0.rpx, 0.rpx),
onTap: () {
TopSlideNotification.show(context,
text: "待开发功能".tr);
Get.toNamed("/privacyPolicyPage");
},
child: Container(
child: Padding(
@@ -568,8 +568,10 @@ class _SettingPageState extends State<SettingPage> {
),
),
Text(
AppConstants().ent_type == 1? 'Copyright © 202-2025 嘉兴太和信息技术有限责任公司 版权所有'
.tr:"Copyright © 202-2025 杭州欢睡科技有限公司 版权所有",
AppConstants().ent_type == 1
? 'Copyright © 202-2025 嘉兴太和信息技术有限责任公司 版权所有'
.tr
: "Copyright © 202-2025 杭州欢睡科技有限公司 版权所有",
style: TextStyle(
color: themeController.currentColor.sc4,
fontFamily: 'Inter',

View File

@@ -4,10 +4,12 @@ import 'package:ef/ef.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_svg/svg.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
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/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/mh_controller/people_info_controller.dart';
@@ -58,7 +60,7 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
children: [
// 中间居中的标题
Text(
'人员资料',
'人员资料'.tr,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
@@ -89,7 +91,9 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
d['height'].toString().isNotEmpty &&
int.tryParse(d['height'].toString()) ==
null) {
showToast("$prefix身高请输入数字");
TopSlideNotification.show(context,
text: "请选择身高".tr,
textColor: Color(0xFFFF7159));
isValid = false;
break;
}
@@ -98,16 +102,9 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
d['weight'].toString().isNotEmpty &&
int.tryParse(d['weight'].toString()) ==
null) {
showToast("$prefix体重请输入数字");
isValid = false;
break;
}
if (d['tel'] != null &&
d['tel'].toString().isNotEmpty &&
!MyUtils.isValidPhoneNumber(
d['tel'].toString())) {
showToast("$prefix请输入正确的电话");
TopSlideNotification.show(context,
text: "请选择体重".tr,
textColor: Color(0xFFFF7159));
isValid = false;
break;
}
@@ -116,7 +113,9 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
d['contact'].toString().isNotEmpty &&
!MyUtils.isValidPhoneNumber(
d['contact'].toString())) {
showToast("$prefix请输入正确的紧急联系人电话");
TopSlideNotification.show(context,
text: "请输入正确的联系人电话".tr,
textColor: Color(0xFFFF7159));
isValid = false;
break;
}
@@ -126,13 +125,15 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
if (isValid) {
for (var data in controller.model.peopleList) {
try {
await controller.savePeoples(
data); // 注意:你这个方法名是 savePeoples建议改成 savePerson
showToast("保存成功(${data['mac']}",
color: color_success);
await controller.savePeoples(data);
TopSlideNotification.show(context,
text: "更新成功".tr,
textColor: Color(0XFF00C1AA));
} catch (e) {
print("保存失败:$e");
showToast("保存失败(${data['mac']}");
TopSlideNotification.show(context,
text: "更新失败".tr,
textColor: Color(0xFFFF7159));
}
}
}
@@ -153,7 +154,7 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
// color: stringToColor("#182B7C"),
// ),
child: Text(
"保存",
"保存".tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Color(0XFF011D33),
@@ -391,12 +392,16 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
SizedBox(
width: 16.rpx,
),
Icon(
Icons.expand_more,
color:
Colors.white,
size: 48.rpx,
),
Container(
height: 30.rpx,
width: 30.rpx,
child:
SvgPicture
.asset(
'assets/img/icon/expand_more.svg',
color: Colors
.white,
))
],
),
],
@@ -560,11 +565,15 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
),
SizedBox(
width: 16.rpx),
Icon(
Icons.expand_more,
color:
Colors.white,
size: 48.rpx),
Container(
height: 30.rpx,
width: 30.rpx,
child: SvgPicture
.asset(
'assets/img/icon/expand_more.svg',
color: Colors
.white,
))
],
),
],
@@ -649,12 +658,16 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
),
SizedBox(
width: 16.rpx),
Icon(
Icons
.expand_more,
color: Colors
.white,
size: 48.rpx),
Container(
height: 30.rpx,
width: 30.rpx,
child:
SvgPicture
.asset(
'assets/img/icon/expand_more.svg',
color: Colors
.white,
))
],
),
],
@@ -769,12 +782,16 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
SizedBox(
width: 16.rpx,
),
Icon(
Icons.expand_more,
color:
Colors.white,
size: 48.rpx,
),
Container(
height: 30.rpx,
width: 30.rpx,
child:
SvgPicture
.asset(
'assets/img/icon/expand_more.svg',
color: Colors
.white,
))
],
),
],

View File

@@ -0,0 +1,121 @@
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/controller/setting/pdf/PrivacyPdfController.dart';
class PrivacyPolicyPage extends StatefulWidget {
PrivacyPolicyPage({super.key});
@override
State<PrivacyPolicyPage> createState() => _PrivacyPolicyPageState();
}
class _PrivacyPolicyPageState extends State<PrivacyPolicyPage> {
PrivacyPdfController pdfController = Get.find();
@override
void initState() {
super.initState();
String language = "zh_CN"; // 默认语言
int ent_type = AppConstants().ent_type;
if (languageController.selectLanguage?.value?.language_code != null) {
language = languageController.selectLanguage!.value!.language_code!;
} // 根据 ent_type 拼接不同的文件名
String pdfName =
ent_type == 1 ? "$language.pdf" : "${language}_$ent_type.pdf";
pdfController.loadPdf(
2,
"https://vsbst-api.he-info.cn/vsbs_sotrage/privacy-scheme/$pdfName",
);
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, bodySize) => GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/new_background.png'), // 本地图片
fit: BoxFit.fill, // 填满整个 Container
),
),
child: Scaffold(
backgroundColor: Colors.transparent, // 加上这一行
appBar: AppBar(
backgroundColor: themeController.currentColor.sc17,
automaticallyImplyLeading: false,
iconTheme: IconThemeData(
color: themeController.currentColor.sc3,
),
titleSpacing: 0,
// leading: returnIconButtom,
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: 20,
child: returnIconButtomNew,
),
],
),
),
actions: [],
centerTitle: false,
),
body: SafeArea(
top: true,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 0.rpx),
child: Column(
children: [
Expanded(
child: Obx(() {
if (pdfController.localPdfPath.value == null) {
return Center(child: CircularProgressIndicator());
} else {
return PDFView(
filePath: pdfController.localPdfPath.value!,
autoSpacing: false,
enableSwipe: true,
swipeHorizontal: false,
pageSnap: true,
fitEachPage: true,
defaultPage: 0,
onRender: (pages) => print('PDF 渲染完成,共 $pages'),
onError: (error) => print('PDF 加载错误: $error'),
);
}
}),
),
],
),
),
),
),
),
),
);
}
}

View File

@@ -3,6 +3,7 @@ import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/controller/mh_controller/apply_repair_controller.dart';
import 'package:vbvs_app/controller/mh_controller/repair_list_controller.dart';
@@ -257,7 +258,7 @@ class DeviceRepairPage extends GetView<RepairListController> {
))
.toList(),
)
: EmptyMessageWidget();
: NullDataWidget();
}),
),
],

View File

@@ -5,6 +5,7 @@ import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
class RoomPickerPage extends StatefulWidget {
final Map data;
@@ -186,7 +187,15 @@ class _RoomPickerPageState extends State<RoomPickerPage> {
"roomId": rooms[selectedIndex]['_id'],
},
onSuccess: (res) {
'更新人员信息成功: $res';
Get.back();
TopSlideNotification.show(context,
text: "更新成功".tr,
textColor: Color(0XFF00C1AA));
},
onFailure: (res) {
TopSlideNotification.show(context,
text: "更新失败".tr,
textColor: Color(0xFFFF7159));
},
);
} catch (e) {
@@ -207,7 +216,7 @@ class _RoomPickerPageState extends State<RoomPickerPage> {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
),
child: Text("完成",
child: Text("完成".tr,
style: TextStyle(
color: const Color(0xFF003058),
fontSize: 30.rpx,

View File

@@ -42,7 +42,7 @@ class ScorePage extends GetView<mh.ScoreController> {
children: [
// 中间居中的标题
Text(
'评价',
'评价'.tr,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
@@ -107,7 +107,7 @@ class ScorePage extends GetView<mh.ScoreController> {
alignment:
AlignmentDirectional(0, 0),
child: Text(
'我要评价',
'我要评价'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
fontSize: 30.rpx,

View File

@@ -40,7 +40,7 @@ class _SleepHabitPageState extends State<SleepHabitPage> {
children: [
// 中间居中的标题
Text(
'设备报修',
'睡眠习惯'.tr,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
@@ -77,7 +77,7 @@ class _SleepHabitPageState extends State<SleepHabitPage> {
width: bodysize!.maxWidth * 1,
height: bodysize!.maxHeight * 0.056,
child: Text(
'柔性唤醒',
'柔性唤醒'.tr,
style: TextStyle(
fontSize: 26.rpx, color: Colors.white),
))),
@@ -95,7 +95,7 @@ class _SleepHabitPageState extends State<SleepHabitPage> {
width: bodysize!.maxWidth * 1,
height: bodysize!.maxHeight * 0.056,
child: Text(
'睡眠隐私',
'睡眠隐私'.tr,
style: TextStyle(
fontSize: 26.rpx, color: Colors.white),
)))

View File

@@ -66,7 +66,7 @@ class Smys extends GetView<SleepingHabitController> {
children: [
// 中间居中的标题
Text(
'睡眠隐私',
'睡眠隐私'.tr,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
@@ -125,7 +125,7 @@ class Smys extends GetView<SleepingHabitController> {
MainAxisAlignment.spaceBetween,
children: [
Text(
'睡眠隐私功能',
'睡眠隐私功能'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
@@ -156,52 +156,52 @@ class Smys extends GetView<SleepingHabitController> {
),
)),
// getLine(),
Container(
width: double.infinity,
height: MediaQuery.sizeOf(context).height * 0.055,
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: const Color(0xFF929699),
width: 0.rpx),
InkWell(
onTap: () async {
showDayTimeSelectionDialog(context,
dayTimeArr: controller.model.smysStartTime,
title: "开始时间".tr, checkChange: (d) {
controller.attr.update((getmodel) {
getmodel.model.smysStartTime = [
int.parse("${d[0]}"),
int.parse("${d[1]}")
];
});
// updateParm();
});
},
child: Container(
width: double.infinity,
height:
MediaQuery.sizeOf(context).height * 0.055,
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: const Color(0xFF929699),
width: 0.rpx),
),
),
),
constraints: BoxConstraints(
minHeight: 90.rpx, // 设置最小高度
),
child: Padding(
padding: EdgeInsets.fromLTRB(
39.rpx, 0.rpx, 30.rpx, 0.rpx),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'开始时间',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 26.rpx,
letterSpacing: 0,
constraints: BoxConstraints(
minHeight: 90.rpx, // 设置最小高度
),
child: Padding(
padding: EdgeInsets.fromLTRB(
39.rpx, 0.rpx, 30.rpx, 0.rpx),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'开始时间'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 26.rpx,
letterSpacing: 0,
),
),
),
InkWell(
onTap: () async {
showDayTimeSelectionDialog(context,
dayTimeArr:
controller.model.smysStartTime,
title: "开始时间", checkChange: (d) {
controller.attr.update((getmodel) {
getmodel.model.smysStartTime = [
int.parse("${d[0]}"),
int.parse("${d[1]}")
];
});
// updateParm();
});
},
child: Row(
Row(
mainAxisSize: MainAxisSize.max,
children: [
Text(
@@ -225,57 +225,56 @@ class Smys extends GetView<SleepingHabitController> {
))
],
),
),
],
),
)),
// getLine(),
Container(
width: double.infinity,
height: MediaQuery.sizeOf(context).height * 0.055,
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: const Color(0xFF929699),
width: 0.rpx),
),
),
constraints: BoxConstraints(
minHeight: 90.rpx, // 设置最小高度
),
child: Padding(
padding: EdgeInsets.fromLTRB(
39.rpx, 0.rpx, 30.rpx, 0.rpx),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'结束时间',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 26.rpx,
letterSpacing: 0,
),
],
),
InkWell(
onTap: () async {
showDayTimeSelectionDialog(context,
dayTimeArr:
controller.model.smysEndTime,
title: "结束时间", checkChange: (d) {
controller.attr.update((getmodel) {
getmodel.model.smysEndTime = [
int.parse("${d[0]}"),
int.parse("${d[1]}")
];
});
// updateParm();
});
},
child: Row(
)),
),
// getLine(),
InkWell(
onTap: () async {
showDayTimeSelectionDialog(context,
dayTimeArr: controller.model.smysEndTime,
title: "结束时间".tr, checkChange: (d) {
controller.attr.update((getmodel) {
getmodel.model.smysEndTime = [
int.parse("${d[0]}"),
int.parse("${d[1]}")
];
});
// updateParm();
});
},
child: Container(
width: double.infinity,
height: MediaQuery.sizeOf(context).height * 0.055,
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: const Color(0xFF929699),
width: 0.rpx),
),
),
constraints: BoxConstraints(
minHeight: 90.rpx, // 设置最小高度
),
child: Padding(
padding: EdgeInsets.fromLTRB(
39.rpx, 0.rpx, 30.rpx, 0.rpx),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'结束时间'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 26.rpx,
letterSpacing: 0,
),
),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Text(
@@ -299,12 +298,11 @@ class Smys extends GetView<SleepingHabitController> {
))
],
),
),
],
],
),
),
),
),
// getLine(),
), // getLine(),
SizedBox(
height: 30.rpx,
),
@@ -314,7 +312,7 @@ class Smys extends GetView<SleepingHabitController> {
width: double.infinity,
decoration: BoxDecoration(),
child: Text(
'*注:开启睡眠隐私功能后,在设置的时间段内,将不会采集您的睡眠数据。',
'*注:开启睡眠隐私功能后,在设置的时间段内,将不会采集您的睡眠数据。'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),

View File

@@ -219,52 +219,6 @@ class _RxhxMhtState extends State<RxhxMht> {
],
),
),
// leading: returnIconButtomAddCallback(() {
// controller.saveDataApi();
// }),
// Container(
// width: double.infinity,
// height: 70.rpx,
// child: Row(
// mainAxisSize: MainAxisSize.max,
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Text(
// '柔性唤醒',
// style: TextStyle(
// fontFamily: 'Readex Pro',
// color: Colors.white,
// letterSpacing: 0,
// fontSize: 30.rpx),
// ),
// InkWell(
// onTap: () {
// alarmChange();
// },
// child: Container(
// margin: EdgeInsets.only(right: 30.rpx),
// width: 140.rpx,
// height: 66.rpx,
// alignment: Alignment.center,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(5),
// color: stringToColor("#182B7C")),
// child: Text(
// "保存",
// style: FlutterFlowTheme.of(context)
// .bodyMedium
// .override(
// fontFamily: 'Readex Pro',
// color: stringToColor("#9EA4B7"),
// letterSpacing: 0,
// fontSize: 30.rpx),
// ),
// ),
// )
// ],
// ),
// ),
actions: [],
centerTitle: false,
),
@@ -343,39 +297,40 @@ class _RxhxMhtState extends State<RxhxMht> {
),
),
getLine(),
Container(
margin: EdgeInsets.only(left: 40.rpx, right: 30.rpx),
width: double.infinity,
height: 90.rpx,
decoration: const BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'唤醒时间',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0,
InkWell(
onTap: () async {
showDayTimeSelectionDialog(context,
dayTimeArr: controller.model.rxhxWakeTime,
title: "唤醒时间", checkChange: (d) {
controller.attr.update((getmodel) {
getmodel.model.rxhxWakeTime = [
int.parse("${d[0]}"),
int.parse("${d[1]}")
];
});
print("$d");
});
},
child: Container(
margin:
EdgeInsets.only(left: 40.rpx, right: 30.rpx),
width: double.infinity,
height: 90.rpx,
decoration: const BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'唤醒时间',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0,
),
),
),
InkWell(
onTap: () async {
showDayTimeSelectionDialog(context,
dayTimeArr: controller.model.rxhxWakeTime,
title: "唤醒时间", checkChange: (d) {
controller.attr.update((getmodel) {
getmodel.model.rxhxWakeTime = [
int.parse("${d[0]}"),
int.parse("${d[1]}")
];
});
print("$d");
});
},
child: Row(
Row(
mainAxisSize: MainAxisSize.max,
children: [
Text(
@@ -399,133 +354,134 @@ class _RxhxMhtState extends State<RxhxMht> {
))
],
),
),
],
],
),
),
),
getLine(),
Container(
margin: EdgeInsets.only(left: 40.rpx, right: 30.rpx),
width: double.infinity,
height: 90.rpx,
decoration: const BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'按摩',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0,
),
),
InkWell(
onTap: () {
showOneSelectionDialog(
context,
arr: ['', ""],
checkIndex:
controller.model.rxhxIsAnMo ? 0 : 1,
title: "按摩",
checkChange: (index) {
controller.attr.update((getmodel) {
getmodel.model.rxhxIsAnMo =
index == 0 ? true : false;
});
},
);
},
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Text(
controller.model.rxhxIsAnMo ? '' : '',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0,
),
InkWell(
onTap: () {
showOneSelectionDialog(
context,
arr: ['', ""],
checkIndex: controller.model.rxhxIsAnMo ? 0 : 1,
title: "按摩",
checkChange: (index) {
controller.attr.update((getmodel) {
getmodel.model.rxhxIsAnMo =
index == 0 ? true : false;
});
},
);
},
child: Container(
margin:
EdgeInsets.only(left: 40.rpx, right: 30.rpx),
width: double.infinity,
height: 90.rpx,
decoration: const BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'按摩',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0,
),
SizedBox(
width: 16.rpx,
),
Container(
height: 30.rpx,
width: 30.rpx,
child: SvgPicture.asset(
'assets/img/icon/expand_more.svg',
),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Text(
controller.model.rxhxIsAnMo ? '' : '',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
))
],
),
),
],
),
fontSize: 26.rpx,
letterSpacing: 0,
),
),
SizedBox(
width: 16.rpx,
),
Container(
height: 30.rpx,
width: 30.rpx,
child: SvgPicture.asset(
'assets/img/icon/expand_more.svg',
color: Colors.white,
))
],
),
],
)),
),
getLine(),
Container(
margin: EdgeInsets.only(left: 40.rpx, right: 30.rpx),
width: double.infinity,
height: 90.rpx,
decoration: const BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'唤醒部位',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0,
),
),
InkWell(
onTap: () {
showOneSelectionDialog(
context,
arr: location,
checkIndex: controller.model.rxhxLocation,
title: "唤醒部位",
checkChange: (index) {
controller.attr.update((getmodel) {
getmodel.model.rxhxLocation = index;
});
},
);
},
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Text(
location[controller.model.rxhxLocation],
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0,
),
InkWell(
onTap: () {
showOneSelectionDialog(
context,
arr: location,
checkIndex: controller.model.rxhxLocation,
title: "唤醒部位",
checkChange: (index) {
controller.attr.update((getmodel) {
getmodel.model.rxhxLocation = index;
});
},
);
},
child: Container(
margin:
EdgeInsets.only(left: 40.rpx, right: 30.rpx),
width: double.infinity,
height: 90.rpx,
decoration: const BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'唤醒部位',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 26.rpx,
letterSpacing: 0,
),
SizedBox(
width: 16.rpx,
),
Container(
height: 30.rpx,
width: 30.rpx,
child: SvgPicture.asset(
'assets/img/icon/expand_more.svg',
),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Text(
location[controller.model.rxhxLocation],
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
))
],
),
),
],
),
fontSize: 26.rpx,
letterSpacing: 0,
),
),
SizedBox(
width: 16.rpx,
),
Container(
height: 30.rpx,
width: 30.rpx,
child: SvgPicture.asset(
'assets/img/icon/expand_more.svg',
color: Colors.white,
))
],
),
],
)),
),
getLine(),
Container(
@@ -550,65 +506,120 @@ class _RxhxMhtState extends State<RxhxMht> {
letterSpacing: 0,
),
),
// Padding(
// padding: EdgeInsetsDirectional.fromSTEB(
// 0, 20.rpx, 0, 0),
// child: Container(
// width: double.infinity,
// height:
// MediaQuery.sizeOf(context).height * 0.046,
// decoration: const BoxDecoration(),
// child: Row(
// mainAxisSize: MainAxisSize.max,
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// ...List.generate(7, (index) {
// return InkWell(
// onTap: () {
// controller.attr.update((getmodel) {
// getmodel.model
// .rxhxWeeks[index] = getmodel
// .model
// .rxhxWeeks[index] ==
// 0
// ? 1
// : 0;
// });
// },
// child: AspectRatio(
// aspectRatio: 1,
// child: ClipOval(
// child: Container(
// height: double.infinity,
// decoration: BoxDecoration(
// color: controller.model
// .rxhxWeeks[
// index] ==
// 1
// ? Color(0xFF84F5FF)
// : Color(0XFF003058)),
// child: Center(
// child: Text(
// weeks[index],
// style: TextStyle(
// color: controller.model
// .rxhxWeeks[
// index] ==
// 1
// ? Color(0XFF003058)
// : Colors.white),
// ),
// ),
// ),
// ),
// ),
// );
// }),
// ],
// ),
// ),
// ),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 20.rpx, 0, 0),
child: Container(
child: SizedBox(
width: double.infinity,
height:
MediaQuery.sizeOf(context).height * 0.046,
decoration: const BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
...List.generate(7, (index) {
return InkWell(
onTap: () {
controller.attr.update((getmodel) {
getmodel.model
.rxhxWeeks[index] = getmodel
.model
.rxhxWeeks[index] ==
0
? 1
: 0;
});
},
child: AspectRatio(
aspectRatio: 1,
child: ClipOval(
child: Container(
height: double.infinity,
decoration: BoxDecoration(
color: controller.model
.rxhxWeeks[
index] ==
1
? Color(0xFF84F5FF)
: Color(0XFF003058)),
child: Center(
child: Text(
weeks[index],
style: TextStyle(
color: controller.model
.rxhxWeeks[
index] ==
1
? Color(0XFF003058)
: Colors.white),
),
),
),
children: List.generate(7, (index) {
final bool selected =
controller.model.rxhxWeeks[index] ==
1;
return InkWell(
onTap: () {
controller.attr.update((getmodel) {
getmodel.model.rxhxWeeks[index] =
getmodel.model
.rxhxWeeks[index] ==
0
? 1
: 0;
});
},
borderRadius: BorderRadius.circular(
50), // 点击水波圆角区域
child: Container(
width: MediaQuery.sizeOf(context)
.height *
0.046, // 保证是正圆
height: MediaQuery.sizeOf(context)
.height *
0.046,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: selected
? const Color(0xFF84F5FF)
: const Color(0xFF003058),
),
alignment: Alignment.center,
child: Text(
weeks[index],
style: TextStyle(
color: selected
? const Color(0xFF003058)
: Colors.white,
),
),
);
}),
],
),
);
}),
),
),
),
)
],
),
),
@@ -624,7 +635,7 @@ class _RxhxMhtState extends State<RxhxMht> {
'*注:开启该功能后,在设置的时间点,设备将启动一段固定时长的柔性唤醒功能。',
style: TextStyle(
fontFamily: 'Readex Pro',
color: Colors.white,
color: Color(0xFF929699),
fontSize: 20.rpx,
letterSpacing: 0,
),

View File

@@ -0,0 +1,126 @@
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/controller/setting/pdf/UserPdfController.dart';
class UserAgreementPage extends StatefulWidget {
UserAgreementPage({super.key});
@override
State<UserAgreementPage> createState() => _UserAgreementPageState();
}
class _UserAgreementPageState extends State<UserAgreementPage> {
UserPdfController pdfController = Get.find();
@override
void initState() {
super.initState();
String language = "zh_CN"; // 默认语言
if (languageController.selectLanguage?.value?.language_code != null) {
language = languageController.selectLanguage!.value!.language_code!;
}
int ent_type = AppConstants().ent_type;
// 根据 ent_type 拼接不同的文件名
String pdfName =
ent_type == 1 ? "$language.pdf" : "${language}_$ent_type.pdf";
pdfController.loadPdf(
1,
"https://vsbst-api.he-info.cn/vsbs_sotrage/user-scheme/$pdfName",
);
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, bodySize) => GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/new_background.png'), // 本地图片
fit: BoxFit.fill, // 填满整个 Container
),
),
child: Scaffold(
backgroundColor: Colors.transparent, // 加上这一行
appBar: AppBar(
backgroundColor: Colors.transparent,
automaticallyImplyLeading: false,
iconTheme: IconThemeData(
color: themeController.currentColor.sc3,
),
titleSpacing: 0,
// leading: returnIconButtom,
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: 20,
child: returnIconButtomNew,
),
],
),
),
actions: [],
centerTitle: false,
),
body: SafeArea(
top: true,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 0.rpx),
child: Column(
children: [
Expanded(
child: Obx(() {
if (pdfController.localPdfPath.value == null) {
return Center(child: CircularProgressIndicator());
} else {
return PDFView(
filePath: pdfController.localPdfPath.value!,
autoSpacing: false,
enableSwipe: true,
swipeHorizontal: false,
pageSnap: true,
fitEachPage: true,
defaultPage: 0,
onRender: (pages) => print('PDF 渲染完成,共 $pages'),
onError: (error) => print('PDF 加载错误: $error'),
);
}
}),
),
],
),
),
),
),
),
),
);
}
}

View File

@@ -179,8 +179,8 @@ class _MHTNewSleepReportPageState extends State<MHTNewSleepReportPage> {
if (widget.data['arrow'] == null ||
widget.data['arrow'] == true)
Positioned(
left: 0,
child: returnIconButtom,
left: 20,
child: returnIconButtomNew,
),
],
),

View File

@@ -122,8 +122,8 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
/// 左边返回按钮
Positioned(
left: 0,
child: returnIconButtom,
left: 20,
child: returnIconButtomNew,
),
],
),

View File

@@ -188,8 +188,8 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
if (widget.data['arrow'] == null ||
widget.data['arrow'] == true)
Positioned(
left: 0,
child: returnIconButtom,
left: 20,
child: returnIconButtomNew,
),
],
),

View File

@@ -77,7 +77,7 @@ class _SleepReportPageState extends State<SleepReportPage> {
/// 左边返回按钮
Positioned(
left: 0,
child: returnIconButtom,
child: returnIconButtomNew,
),
],
),

View File

@@ -57,15 +57,13 @@ class _AboutUsPageState extends State<AboutUsPage> {
alignment: Alignment.center,
children: [
/// 居中标题
Text(
'关于我们'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
letterSpacing: 0,
fontSize: 30.rpx,
),
),
Text('关于我们'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
letterSpacing: 0,
fontSize: 30.rpx,
)),
/// 左边返回按钮
Positioned(

View File

@@ -1,5 +1,6 @@
import 'package:ef/ef.dart';
import 'package:flutter/cupertino.dart';
import 'package:path/path.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
@@ -8,6 +9,7 @@ import 'package:vbvs_app/main.dart';
import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.dart';
import 'package:vbvs_app/pages/mh_page/HomeDeviceType.dart';
import 'package:vbvs_app/pages/mh_page/LanguagePage.dart';
import 'package:vbvs_app/pages/mh_page/about_us.dart';
import 'package:vbvs_app/pages/mh_page/address_list_page.dart';
import 'package:vbvs_app/pages/mh_page/applyRepair/apply_repair_success.dart';
import 'package:vbvs_app/pages/mh_page/apply_repair_page.dart';
@@ -25,6 +27,7 @@ import 'package:vbvs_app/pages/mh_page/device_share_page.dart';
import 'package:vbvs_app/pages/mh_page/edit_bed.dart';
import 'package:vbvs_app/pages/mh_page/help/article.dart';
import 'package:vbvs_app/pages/mh_page/homepage/new_Home_page.dart';
import 'package:vbvs_app/pages/mh_page/privacy_policy.dart';
import 'package:vbvs_app/pages/mh_page/user/page/edit_userinfo_page.dart';
import 'package:vbvs_app/pages/mh_page/experience_store_page.dart';
import 'package:vbvs_app/pages/mh_page/issue_list_page.dart';
@@ -40,6 +43,7 @@ import 'package:vbvs_app/pages/mh_page/user/page/find_password_page.dart';
import 'package:vbvs_app/pages/mh_page/user/page/mht_login_page.dart';
import 'package:vbvs_app/pages/mh_page/user/page/rxhx_mht.dart';
import 'package:vbvs_app/pages/mh_page/user/page/update_password_page.dart';
import 'package:vbvs_app/pages/mh_page/user_agreement_page.dart';
import 'package:vbvs_app/pages/sleep_report/new_sleep_report_page.dart';
import '../pages/mh_page/bluetooth.dart';
import '../pages/mh_page/edit_address_page.dart';
@@ -98,6 +102,9 @@ var mhroutes = {
"/helpArticle": (contxt, {arguments}) => HelpArticle(article: arguments),
"/mHTPeopleInfoPage": (contxt) => MHTPeopleInfoPage(),
"/applyRepairSuccess": (contxt) => ApplyRepairSuccess(),
"/aboutUs": (contxt) => MhAboutUsPage(),
"/userAgreementPage": (context) => UserAgreementPage(),
"/privacyPolicyPage": (context) => PrivacyPolicyPage(),
};
var mhonGenerateRoute = (RouteSettings settings) {
final String? name = settings.name; // 获取路由名称,如 /news 或 /search

View File

@@ -5,9 +5,9 @@ packages:
dependency: "direct main"
description:
path: "."
ref: master
ref: cff5448fe07ca7f2141dcb1b7c5ee430ca44d64d
resolved-ref: cff5448fe07ca7f2141dcb1b7c5ee430ca44d64d
url: "http://git.real.he-info.cn:8080/r/~qmqz/EasyDartModule.git"
url: "http://git.he-info.cn/r/~qmqz/EasyDartModule.git"
source: git
version: "1.0.0"
_fe_analyzer_shared:
@@ -63,54 +63,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.7"
app_links:
dependency: transitive
description:
name: app_links
sha256: "85ed8fc1d25a76475914fff28cc994653bd900bc2c26e4b57a49e097febb54ba"
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.4.0"
app_links_linux:
dependency: transitive
description:
name: app_links_linux
sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.3"
app_links_platform_interface:
dependency: transitive
description:
name: app_links_platform_interface
sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.2"
app_links_web:
dependency: transitive
description:
name: app_links_web
sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.4"
appwrite:
dependency: transitive
description:
name: appwrite
sha256: f5b8a4bfceb9c7b1cd380346863840fa6799eb515830bf04a9557424fdf92b23
url: "https://pub.flutter-io.cn"
source: hosted
version: "13.1.1"
archive:
dependency: transitive
dependency: "direct main"
description:
name: archive
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.6.1"
version: "4.0.7"
args:
dependency: transitive
description:
@@ -135,6 +95,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.0"
azlistview:
dependency: "direct main"
description:
name: azlistview
sha256: "93e865f11777a271b439f0d6b00799c0797e9daeec2e082a2e01373809c4b90d"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.0"
barcode:
dependency: transitive
description:
@@ -367,14 +335,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
cookie_jar:
dependency: transitive
description:
name: cookie_jar
sha256: a6ac027d3ed6ed756bfce8f3ff60cb479e266f3b0fdabd6242b804b6765e52de
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.8"
cross_file:
dependency: transitive
description:
@@ -447,22 +407,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.3"
device_info_plus:
dependency: transitive
description:
name: device_info_plus
sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074
url: "https://pub.flutter-io.cn"
source: hosted
version: "10.1.2"
device_info_plus_platform_interface:
dependency: transitive
description:
name: device_info_plus_platform_interface
sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2"
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.0.2"
dio:
dependency: transitive
description:
@@ -498,9 +442,20 @@ packages:
easydevice:
dependency: "direct main"
description:
path: "C:\\Users\\a\\Desktop\\blue\\easydevice"
relative: false
source: path
path: "."
ref: main
resolved-ref: f307495aac440031d119a728beaccf5d33003932
url: "https://gitea.wslpc.real.he-info.cn:94/flutter/easydevice.git"
source: git
version: "0.0.1"
easyweb:
dependency: "direct main"
description:
path: "."
ref: e86d515f77
resolved-ref: e86d515f77a736a5e6f09036e5e022153cde425d
url: "https://gitea.wslpc.real.he-info.cn:94/flutter/easyweb.git"
source: git
version: "0.0.1"
ed25519_edwards:
dependency: transitive
@@ -515,8 +470,8 @@ packages:
description:
path: "."
ref: main
resolved-ref: "623980055c62d475ab13921d520eacac237ca070"
url: "http://admin@git.real.he-info.cn:8080/r/ef.git"
resolved-ref: "495112d603fbd9d72a709af1f728f14276be012e"
url: "https://gitea.wslpc.real.he-info.cn:94/flutter/ef.git"
source: git
version: "0.0.1"
emoji_flag_converter:
@@ -814,22 +769,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_auth_2:
dependency: transitive
description:
name: flutter_web_auth_2
sha256: "4d3d2fd3d26bf1a26b3beafd4b4b899c0ffe10dc99af25abc58ffe24e991133c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
flutter_web_auth_2_platform_interface:
dependency: transitive
description:
name: flutter_web_auth_2_platform_interface
sha256: e8669e262005a8354389ba2971f0fc1c36188481234ff50d013aaf993f30f739
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.0"
flutter_web_plugins:
dependency: transitive
description: flutter
@@ -876,14 +815,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.0"
functions_client:
dependency: transitive
description:
name: functions_client
sha256: b410e4d609522357396cd84bb9a8f6e3a4561b5f7d3ce82267f6f1c2af42f16b
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.2"
geocoding:
dependency: "direct main"
description:
@@ -1060,14 +991,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.6.0"
gotrue:
dependency: transitive
description:
name: gotrue
sha256: "04a6efacffd42773ed96dc752f19bb20a1fbc383e81ba82659072b775cf62912"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.12.0"
graphs:
dependency: transitive
description:
@@ -1084,14 +1007,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.4"
gtk:
dependency: transitive
description:
name: gtk
sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
html:
dependency: transitive
description:
@@ -1228,14 +1143,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.9.0"
jwt_decode:
dependency: transitive
description:
name: jwt_decode
sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.1"
leak_tracker:
dependency: transitive
description:
@@ -1292,14 +1199,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
lottie:
lpinyin:
dependency: "direct main"
description:
name: lottie
sha256: fa39707f36786707b01eca7626d2c16c32aa603b3f3a146518518458847dc127
name: lpinyin
sha256: "0bb843363f1f65170efd09fbdfc760c7ec34fc6354f9fcb2f89e74866a0d814a"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.0"
version: "2.0.3"
macros:
dependency: transitive
description:
@@ -1404,15 +1311,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.0.2"
mongows:
dependency: transitive
description:
path: "."
ref: main
resolved-ref: "7302210bd91f839b7ed63c6aa94af6c75f25c67a"
url: "https://gitea.wslpc.real.he-info.cn:94/flutter/mongows.git"
source: git
version: "0.10.3"
mqtt5_client:
dependency: transitive
description:
@@ -1693,14 +1591,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.5.1"
postgrest:
posix:
dependency: transitive
description:
name: postgrest
sha256: "10b81a23b1c829ccadf68c626b4d66666453a1474d24c563f313f5ca7851d575"
name: posix
sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.2"
version: "6.0.2"
power_extensions:
dependency: transitive
description:
@@ -1765,14 +1663,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.3"
realtime_client:
dependency: transitive
description:
name: realtime_client
sha256: "3a0a99b5bd0fc3b35e8ee846d9a22fa2c2117f7ef1cb73d1e5f08f6c3d09c4e9"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.5.0"
redis:
dependency: transitive
description:
@@ -1781,14 +1671,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.0"
retry:
dependency: transitive
description:
name: retry
sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
rfc_6901:
dependency: transitive
description:
@@ -1837,6 +1719,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.3"
scrollable_positioned_list:
dependency: transitive
description:
name: scrollable_positioned_list
sha256: "9566352ab9ba05794ee6c8864f154afba5d36c5637d0e3e32c615ba4ceb92772"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.3"
shared_preferences:
dependency: transitive
description:
@@ -2026,14 +1916,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.2"
storage_client:
dependency: transitive
description:
name: storage_client
sha256: "09bac4d75eea58e8113ca928e6655a09cc8059e6d1b472ee801f01fde815bcfc"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.0"
stream_channel:
dependency: transitive
description:
@@ -2066,22 +1948,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.33"
supabase:
dependency: transitive
description:
name: supabase
sha256: f00172f5f0b2148ea1c573f52862d50cacb6f353f579f741fa35e51704845958
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.7.0"
supabase_flutter:
dependency: transitive
description:
name: supabase_flutter
sha256: d88eccf9e46e57129725a08e72a3109b6f780921fdc27fe3d7669a11ae80906b
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.9.0"
syncfusion_flutter_core:
dependency: transitive
description:
@@ -2450,22 +2316,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.10.1"
win32_registry:
dependency: transitive
description:
name: win32_registry
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.5"
window_to_front:
dependency: transitive
description:
name: window_to_front
sha256: "7aef379752b7190c10479e12b5fd7c0b9d92adc96817d9e96c59937929512aee"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.0.3"
xdg_directories:
dependency: transitive
description:
@@ -2490,14 +2340,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.3"
yet_another_json_isolate:
dependency: transitive
description:
name: yet_another_json_isolate
sha256: fe45897501fa156ccefbfb9359c9462ce5dec092f05e8a56109db30be864f01e
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
sdks:
dart: ">=3.5.4 <4.0.0"
flutter: ">=3.24.0"