354 lines
20 KiB
Dart
Executable File
354 lines
20 KiB
Dart
Executable File
import 'dart:async';
|
||
import 'dart:convert';
|
||
import 'dart:io';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter/scheduler.dart';
|
||
import 'package:flutter/services.dart';
|
||
import 'package:flutter_pcm_sound/flutter_pcm_sound.dart';
|
||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||
import 'package:get/get.dart';
|
||
import 'package:star_lock/app_settings/app_colors.dart';
|
||
import 'package:star_lock/blue/blue_manage.dart';
|
||
import 'package:star_lock/main/lockMian/lockList/lockList_xhj_page.dart';
|
||
import 'package:star_lock/main/lockMian/lockMain/lockMain_state.dart';
|
||
import 'package:star_lock/talk/call/g711.dart';
|
||
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
||
import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart';
|
||
import 'package:star_lock/talk/starChart/proto/talk_request.pb.dart';
|
||
import 'package:star_lock/talk/starChart/proto/test.pb.dart';
|
||
import 'package:star_lock/talk/starChart/star_chart_manage.dart';
|
||
import 'package:star_lock/tools/noData.dart';
|
||
import 'package:star_lock/tools/submitBtn.dart';
|
||
|
||
import '../../../appRouters.dart';
|
||
import '../../../baseWidget.dart';
|
||
import '../../../flavors.dart';
|
||
import '../../../mine/mine/starLockMine_page.dart';
|
||
import '../../../tools/EasyRefreshTool.dart';
|
||
import '../../../tools/eventBusEventManage.dart';
|
||
import '../../../tools/storage.dart';
|
||
import '../../../tools/titleAppBar.dart';
|
||
import '../../lockDetail/lockDetail/lockDetail_page.dart';
|
||
import '../entity/lockListInfo_entity.dart';
|
||
import '../lockList/lockList_page.dart';
|
||
import 'lockMain_logic.dart';
|
||
|
||
class StarLockMainPage extends StatefulWidget {
|
||
StarLockMainPage({Key? key, this.showAppBar = true, this.showDrawer = true})
|
||
: super(key: key);
|
||
bool showAppBar;
|
||
bool showDrawer;
|
||
|
||
@override
|
||
State<StarLockMainPage> createState() => _StarLockMainPageState();
|
||
}
|
||
|
||
class _StarLockMainPageState extends State<StarLockMainPage>
|
||
with BaseWidget, AutomaticKeepAliveClientMixin, WidgetsBindingObserver {
|
||
final LockMainLogic logic = Get.put(LockMainLogic());
|
||
final LockMainState state = Get.find<LockMainLogic>().state;
|
||
|
||
Future<void> getHttpData(
|
||
{bool clearScanDevices = false, bool isUnShowLoading = false}) async {
|
||
LockListInfoGroupEntity? lockListInfoGroupEntity =
|
||
await Storage.getLockMainListData();
|
||
if (lockListInfoGroupEntity != null) {
|
||
await logic.loadMainDataLogic(lockListInfoGroupEntity);
|
||
setState(() {});
|
||
}
|
||
lockListInfoGroupEntity =
|
||
(await logic.getStarLockInfo(isUnShowLoading: isUnShowLoading)).data;
|
||
if (lockListInfoGroupEntity != null) {
|
||
await logic.loadMainDataLogic(lockListInfoGroupEntity);
|
||
setState(() {});
|
||
}
|
||
if (clearScanDevices) {
|
||
BlueManage().scanDevices.clear();
|
||
}
|
||
}
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
logic.pageNo = 1;
|
||
getHttpData(
|
||
isUnShowLoading: true,
|
||
);
|
||
_initLoadDataAction();
|
||
}
|
||
|
||
String bufferToHexString(Uint8List buffer) {
|
||
return buffer.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join();
|
||
}
|
||
|
||
@override
|
||
void didChangeDependencies() {
|
||
super.didChangeDependencies();
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return GetBuilder<LockMainLogic>(builder: (LockMainLogic logic) {
|
||
Widget child = EasyRefreshTool(
|
||
onRefresh: () {
|
||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||
// 更新状态的代码
|
||
logic.pageNo = 1;
|
||
getHttpData();
|
||
});
|
||
},
|
||
// child: getDataReturnUI(state.dataLength.value));
|
||
child: getDataReturnUI(state.dataLength.value));
|
||
if (widget.showAppBar || widget.showDrawer) {
|
||
child = Scaffold(
|
||
backgroundColor: const Color(0xFFF5F5F5),
|
||
appBar: widget.showAppBar
|
||
? TitleAppBar(
|
||
barTitle: F.navTitle,
|
||
haveBack: false,
|
||
haveOtherLeftWidget: true,
|
||
leftWidget: Builder(
|
||
builder: (BuildContext context) => IconButton(
|
||
icon: Image.asset(
|
||
'images/main/mainLeft_menu_icon.png',
|
||
color: Colors.white,
|
||
width: 44.w,
|
||
height: 44.w,
|
||
),
|
||
onPressed: () {
|
||
Scaffold.of(context).openDrawer();
|
||
},
|
||
)),
|
||
backgroundColor: AppColors.mainColor,
|
||
)
|
||
: null,
|
||
drawer: widget.showDrawer
|
||
? Drawer(
|
||
width: 1.sw / 3 * 2,
|
||
child: const StarLockMinePage(),
|
||
)
|
||
: null,
|
||
body: child,
|
||
);
|
||
}
|
||
child = F.sw(
|
||
skyCall: () => child,
|
||
xhjCall: () => Container(
|
||
decoration: const BoxDecoration(
|
||
image: DecorationImage(
|
||
image: AssetImage('images/xhj_main_bg.jpg'),
|
||
fit: BoxFit.cover,
|
||
),
|
||
),
|
||
child: child,
|
||
));
|
||
return child;
|
||
});
|
||
}
|
||
|
||
Widget getDataReturnUI(int type) {
|
||
Widget returnWidget;
|
||
|
||
if (type == 1) {
|
||
type = F.sw(skyCall: () => 1, xhjCall: () => 2);
|
||
}
|
||
switch (type) {
|
||
case 0:
|
||
// 显示无数据模式
|
||
returnWidget = unHaveData();
|
||
break;
|
||
case 1:
|
||
// 只有一条数据
|
||
Storage.setBool(ifIsDemoModeOrNot, false);
|
||
returnWidget = LockDetailPage(
|
||
isOnlyOneData: true,
|
||
lockListInfoItemEntity:
|
||
state.lockListInfoGroupEntity.value.groupList![0].lockList![0]);
|
||
break;
|
||
case 2:
|
||
// 有多条数据
|
||
Storage.setBool(ifIsDemoModeOrNot, false);
|
||
returnWidget = F.sw(
|
||
skyCall: () => LockListPage(
|
||
lockListInfoGroupEntity: state.lockListInfoGroupEntity.value),
|
||
xhjCall: () => LockListXHJPage(
|
||
lockListInfoGroupEntity: state.lockListInfoGroupEntity.value));
|
||
break;
|
||
default:
|
||
returnWidget = NoData();
|
||
break;
|
||
}
|
||
return returnWidget;
|
||
}
|
||
|
||
//鑫泓佳背景
|
||
Widget XHJBg({required Widget child}) {
|
||
return Container();
|
||
}
|
||
|
||
Widget unHaveData() {
|
||
return ListView(
|
||
children: <Widget>[
|
||
Column(
|
||
mainAxisAlignment: MainAxisAlignment.center,
|
||
children: <Widget>[
|
||
SizedBox(
|
||
height: 160.h,
|
||
),
|
||
Row(
|
||
mainAxisAlignment: MainAxisAlignment.center,
|
||
children: <Widget>[
|
||
SizedBox(
|
||
width: 330.w,
|
||
child: InkWell(
|
||
child: Padding(
|
||
padding: const EdgeInsets.all(30.0),
|
||
child: Image.asset(
|
||
'images/main/icon_main_unHaveLockData.png',
|
||
width: 260.w,
|
||
height: 260.w,
|
||
),
|
||
),
|
||
onTap: () {
|
||
//实现回调函数
|
||
Navigator.pushNamed(
|
||
context,
|
||
Routers.selectLockTypePage,
|
||
);
|
||
},
|
||
)),
|
||
],
|
||
),
|
||
Container(
|
||
padding: EdgeInsets.only(left: 30.w, right: 30.w),
|
||
child: Text(
|
||
'添加锁时,手机必须在锁旁边'.tr,
|
||
textAlign: TextAlign.center,
|
||
style: TextStyle(
|
||
fontSize: 26.sp,
|
||
// fontWeight: FontWeight.w800,
|
||
color: Colors.black),
|
||
)),
|
||
SizedBox(
|
||
height: 160.h,
|
||
),
|
||
// _buildImage(),
|
||
// SubmitBtn(
|
||
// btnName: '发送音视频数据',
|
||
// onClick: () {
|
||
// StartChartManage().sendTalkDataMessage(
|
||
// talkData: TalkData(
|
||
// content: [1, 2, 3, 4],
|
||
// contentType: TalkData_ContentTypeE.Image,
|
||
// durationMs: DateTime.now().millisecondsSinceEpoch ~/ 1000,
|
||
// ),
|
||
// );
|
||
// },
|
||
// ),
|
||
// SubmitBtn(
|
||
// btnName: '发送地址',
|
||
// onClick: () async {
|
||
// StartChartManage().startSendingRbcuInfoMessages(ToPeerId: 'A3HPybdRQYKRBxDneQ5gPX6Wk55CKGAAz2w2L2k4head');
|
||
// // String assetPath = 'assets/test.jpg'; // 替换为你的图片路径
|
||
// // List<int> imageBytes = await loadAssetImageAsBytes(assetPath);
|
||
// // // String testStr =
|
||
// // // '---天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰余成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔龙师火帝鸟官人皇始制文字乃服衣裳推位让国有虞陶唐吊民伐罪周发殷汤坐朝问道垂拱平章爱育黎首臣伏戎羌遐迩体率宾归王鳴鳳翔兮神靈應和炫耀光芒照灼穹蒼迤邐岷峨嶢峻崢巍懿承緒劬勞育秩延佚賡孳蕃鑑識祗崇乾坤纘宵旰卿芮詒朔皎琲犂檄圮黯馭燎竈硎洮蠟胝攢囤嶇葺錡堯羲冕箕翬騏闡燮鸞蓊枘橐榘稟泗沂涖浹涔浣淇漱瀋潢瀾沚澮澆潦瀦瀌瀹灧炅焯燠燋爨熠焜煆烜燴炻熛燧牝牯犛犴牖牒疰疴痀癜痱癃皞皎盂盰盱盻眚眵瞋瞑瞷矙矧矬矰矞砟砉砥砣硇磑磲硤硭礌礞礡祀祚祜祧祼祺禋禡秭秣稃稞稹稷穈穄窀窆窠窸笄筇筌筅筮箦篑篯簟籀籝糅糗紵紽紾綃綈綬綣緜縞縰縻縴繢繇繙罟罾羝羶羸羼翊翕翥翡翳翽耖耜耠耱耦耧耩耨耬耵耶胂胼胬脘腽膦臢臬臾舂舄舡舸艋艏艟艤艚艨艪艭艴芏芊苣苴苕茌茱荄荃莛莪莶菰萁菸菽萸葶蒯蓍蓐蓬蓼蔌蔪蕈蕖蕙蕺蕻薷藦藨藭蘅蘧蘼虍虔虬虮虰虺虻蚨蚋蚱蛏蛘蜊蜍蜉蜣蜥蜩蜴蜱蜮蜾蝣蝤蝥螓螯螨蟒蟑蟛蠊蠋蠛蠡蠹衄衒衢衾袢袷裎裥裨裾褊褙褚褡褰褶襁襦襻觇觋觖觫觿訇訑訾詑詈詟詹誊誨誥誦誨諉諛謏謦譊譖譟譬譯譴讴讵讷诐诪诮诰诳诶谂谄谌谏谑谟谡谥谧谮谯谳谵豇豉豕豚豳豸貂貊貔賑賚賡贐赍赑赗赪赭赳趑趔趱趿跂跏跎跖跗跣跹跽踆踔踝踟踬踮踯蹀蹅蹇蹉蹐蹙蹦蹩躅躐躔躜躞軎軑軔軛軫軬軺輀輅輇輈輐輗輢輦輭輶轋轘轜辀辂辒辚辩迓迕迤迨迮逄逋逑逖逯遄遘遑遴遽邂邈邋邙邡邴邳邶郅郇郛郡郾鄌鄑鄘鄜鄞鄢鄣鄯鄹酃酆酈酖酗酘酢酤酴酹酽酾酾醅醊醑醚醢醪醭醮醯醵醴醶釃釅釐釜釡釴釸釾鉅鈦鈍鈹鈾鈿鉦鉬鉮鉻鉿銎銋銖銩銫銮銲鋈鋋鋌鋮鋯鋹鋻錎錡錣錤鍉鍐鍬鍱鍾鎏鎑鎒鎰鎵鎸鎿鏊鏖鏞鏟鏸鏹鏺鏽鐃鐋鐔鐛鐠鐣鐦鐭鐮鐯鐳鐴鐵鐼鐿鑌鑒鑔鑕鑞鑢鑬鑰鑱鑲鑴鑽鑾鑿钁钆钇钋钍钏钔钗钜钯钴钷钹钺钼钽钿铄铈铊铍铐铖铗铘铙铚铠铨铪铬铮铰铹铼铿锃锆锊锍锎锏锒锓锔锖锗锘锞锟锢锩锫锬锭锯锴锶锷锸锺锼锾镂镄镅镆镉镎镏镒镔镖镙镛镞镡镢镤镩镪镫镬镭镮镯镰镱镲镳镴镶镸长門閃閔閘閡闅闈闑闒闓闔闛闞闠闤闥闦闬闿阂阃阄阆阇阘阛阝队阡阯阱阪阽陀陂陉陔陘陞陟陧陬陲陴陶隃隋隍隒隓隗隦隰隱隳隵隶隽隿雎雋雐雚雝雟雤雩雯雱雿霈霅霌霎霏霗霙霛霝霡霣霤霧靂靅靆靉靎靏靐靕靗靛靡靺靻靽鞀鞉鞎鞑鞔鞖鞚鞝鞡鞤鞧鞨鞫鞬鞮鞯鞳鞴韁韃韈韉韋韐韒韓韗韙韝韟韢韡韣韦韧韨韩韪韫韬韭韮韯韲音頍頏頔頖頞頟頤頦頬頰頲頴頵頹頽頿顃顅顈顊顋顒顕顗顛顝顟顤顪顫顬顮顰顱顲顳顴页顶顷顸颃预颋颌颎颏颐频颓颔颕颙颖颛颟颡颢颣颤颥颦颧風颮颯颰颱颳颶颷颸颹颻颼颾飁飆飇飉飋飏飐飔飗飘飙飚飛飜飝飛飜飝飛飜飝飛飜飝雊霺霿靁靟鞲韞韭頫顴颿飌飡馺駃騑騜髐鬃鰩鳯鷊黴在古老的东方有一座美丽的城市名为锦绣锦绣城四季如春风景秀丽是人们心中的理想之地城中有一条清澈见底的小河河水潺潺流过滋养着两岸的花草树木河边有一座古老的石桥桥上雕刻着精美的图案见证了无数过往行人锦绣城的居民勤劳善良他们日出而作日落而息过着简单而幸福的生活城中有一位智者名叫慧心慧心先生博学多才深受人们的尊敬他常常在河边的亭子里给孩子们讲述历史故事传授知识和智慧孩子们围坐在他身边听得津津有味仿佛置身于一个个奇妙的世界在锦绣城的北边有一片茂密的森林森林里生活着各种各样的动物有活泼可爱的猴子它们在树上跳跃嬉戏有威武雄壮的老虎它们在林间巡视守护着森林的安宁还有许多不知名的鸟儿它们在枝头欢快地歌唱为森林增添了无限生机一天慧心先生带着几个学生走进森林进行一次生动的自然课他们观察着各种植物的生长了解它们的特性聆听鸟儿的鸣叫感受大自然的和谐学生们兴奋不已他们发现大自然是一个神奇的宝库蕴藏着无尽的奥秘在森林的深处有一片神秘的湖泊湖水碧绿如玉清澈见底传说中湖中住着一位美丽的水仙子她用神奇的力量保护着湖泊和周围的生灵慧心先生告诉学生们要爱护大自然与万物和谐共处才能得到大自然的馈赠锦绣城的居民们深知这一点他们珍惜每一滴水每一寸土地努力保护着这片美丽的家园他们相信只要人与自然和谐相处锦绣城将永远充满生机与活力锦绣城外群山环绕山间云雾缭绕宛如仙境山中有一处幽静的山谷谷中开满了五颜六色的花朵香气扑鼻引得蝴蝶翩翩起舞山谷中还有一条蜿蜒的小径两旁长满了奇花异草仿佛是一条通往神秘世界的通道慧心先生的学生们在一次探险中偶然发现了这个山谷他们惊叹于大自然的鬼斧神工纷纷拿出画笔将这美丽的景色描绘下来他们还发现了一种奇特的植物它的叶子呈现出透明的蓝色在阳光下闪闪发光仿佛蕴含着神秘的力量慧心先生告诉他们这种植物名为“梦幻草”只生长在特定的环境中非常稀有在锦绣城的东边有一片广阔的草原草原上绿草如茵牛羊成群草原上还有一座古老的风车风车的叶片随风旋转发出“吱呀吱呀”的声响仿佛在诉说着岁月的故事草原上的人们以放牧为生他们骑着骏马驰骋在广阔的天地间享受着自由自在的生活一天慧心先生带领学生们来到草原给他们上了一堂生动的地理课他指着远处的山脉告诉学生们山脉的形成过程以及它们对气候和生态环境的影响学生们听得入迷仿佛置身于大自然的怀抱中感受到了大自然的壮丽与神奇在锦绣城的南边有一片茂密的竹林竹林里竹子挺拔绿意盎然竹林中有一条清澈的小溪溪水潺潺流淌溪边长满了青苔竹林里还有一座精致的小亭子亭子的柱子上刻着优美的诗句让人感受到一种宁静与雅致慧心先生常常在竹林中的小亭子里静坐思考人生的哲理他告诉学生们竹子虽然柔弱但却有着坚韧不拔的精神无论遇到多大的困难都能顽强地生长学生们深受启发明白了在人生的道路上要像竹子一样勇敢地面对挑战坚持不懈地追求自己的理想锦绣城的居民们还擅长制作各种手工艺品他们的作品精美绝伦远近闻名有巧夺天工的陶瓷色彩斑斓形态各异有细腻精致的刺绣图案生动栩栩如生还有雕刻精美的木雕栩栩如生令人叹为观止这些手工艺品不仅展现了锦绣城居民的智慧和技艺也成为了他们与外界交流的纽带在锦绣城的中心有一座宏伟的宫殿宫殿的建筑风格独特气势恢宏宫殿的屋顶覆盖着金色的琉璃瓦在阳光下熠熠生辉宫殿的墙壁上雕刻着精美的图案栩栩如生仿佛在诉说着一个个古老的故事宫殿里住着一位英明的君主他以仁爱之心治理国家深受百姓的爱戴慧心先生常常受邀到宫殿中为君主出谋划策帮助他解决国家大事君主也非常尊重慧心先生的智慧常常向他请教治国之道在他们的共同努力下锦绣城国泰民安繁荣昌盛锦绣城的居民们还非常重视教育他们相信知识能够改变命运让孩子们拥有更加美好的未来城中有一座古老的书院书院的建筑古朴典雅环境优美书院里有许多博学的老师他们用心地教导学生传授知识和智慧学生们在这里努力学习汲取知识的养分,为将来的发展打下坚实的基础慧心先生也常常到书院授课他用自己的知识和智慧启迪学生们的思维引导他们去探索未知的世界学生们对慧心先生敬仰有加他们知道只有不断学习才能像慧心先生一样拥有渊博的知识和智慧为社会做出贡献锦绣城的故事还有很多这里的人们用自己的勤劳和智慧创造了一个充满生机与活力的美好家园他们相信只要人与自然和谐相处与他人携手共进锦绣城的明天一定会更加美好==';
|
||
// //
|
||
// // // List<int> imageBytes = utf8.encode(testStr).toList();
|
||
// // // List<int> imageBytes = utf8.encode(testStr).toList();
|
||
// // // state.talkData.value = imageBytes;
|
||
// // // setState(() {});
|
||
// // String toPeerId =
|
||
// // '2vzXdjdzipJBpWpJxhiRzCFXrDKk54t3YJ7EjYPSRuij';
|
||
// // StartChartManage()
|
||
// // .sendEchoMessage(payload: imageBytes, toPeerId: toPeerId);
|
||
// },
|
||
// ),
|
||
// SubmitBtn(
|
||
// btnName: '停止',
|
||
// onClick: () async {
|
||
// StartChartManage().stopSendingRbcuInfoMessages();
|
||
// },
|
||
// ),
|
||
if (F.isLite)
|
||
Container()
|
||
else
|
||
SubmitBtn(
|
||
btnName: '演示模式'.tr,
|
||
onClick: () {
|
||
Get.toNamed(Routers.demoModeLockDetailPage);
|
||
},
|
||
)
|
||
],
|
||
),
|
||
],
|
||
);
|
||
}
|
||
|
||
late StreamSubscription _teamEvent;
|
||
|
||
void _initLoadDataAction() {
|
||
_teamEvent = eventBus
|
||
.on<RefreshLockListInfoDataEvent>()
|
||
.listen((RefreshLockListInfoDataEvent event) {
|
||
logic.pageNo = 1;
|
||
getHttpData(
|
||
clearScanDevices: event.clearScanDevices,
|
||
isUnShowLoading: event.isUnShowLoading);
|
||
});
|
||
}
|
||
|
||
Future<List<int>> loadAssetImageAsBytes(String assetPath) async {
|
||
try {
|
||
// 从资产中加载字节数据
|
||
ByteData byteData = await rootBundle.load(assetPath);
|
||
|
||
// 将 ByteData 转换为 Uint8List
|
||
Uint8List uint8List =
|
||
Uint8List.sublistView(byteData); //byteData.buffer.asUint8List();
|
||
|
||
// 返回字节数组
|
||
return uint8List.toList();
|
||
} catch (e) {
|
||
print('从资产加载图片时发生错误: $e');
|
||
rethrow;
|
||
}
|
||
}
|
||
|
||
@override
|
||
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||
super.didChangeAppLifecycleState(state);
|
||
// AppLog.log('App--->state:$state');
|
||
switch (state) {
|
||
case AppLifecycleState.inactive:
|
||
// AppLog.log('App--->进入非活动状态');
|
||
break;
|
||
case AppLifecycleState.paused:
|
||
// AppLog.log('App--->进入后台');
|
||
BlueManage().disconnect();
|
||
break;
|
||
case AppLifecycleState.resumed:
|
||
// AppLog.log('App--->进入前台');
|
||
logic.pageNo = 1;
|
||
getHttpData();
|
||
break;
|
||
case AppLifecycleState.detached:
|
||
// AppLog.log('App--->挂起');
|
||
break;
|
||
case AppLifecycleState.hidden:
|
||
// AppLog.log('App--->隐藏');
|
||
break;
|
||
}
|
||
}
|
||
|
||
@override
|
||
void dispose() {
|
||
super.dispose();
|
||
Get.delete<LockMainLogic>();
|
||
_teamEvent.cancel();
|
||
}
|
||
|
||
@override
|
||
bool get wantKeepAlive => true;
|
||
}
|