From 9df37f33b0494ce83b2e0c82eeda71cf374fb34f Mon Sep 17 00:00:00 2001 From: 18631081161 <2088094923@qq.com> Date: Fri, 26 Jul 2024 13:26:09 +0800 Subject: [PATCH] =?UTF-8?q?ui=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/ic_launcher.png | Bin 0 -> 16500 bytes assets/images/ic_memory.png | Bin 2428 -> 7404 bytes lib/dialog/restart_chat_dialog.dart | 93 +++++++++++++++++++++ lib/main.dart | 4 + lib/tools/chat/chat_page.dart | 93 +++++++++++++-------- lib/tools/find/multiplex_page.dart | 54 +++++++----- lib/tools/find/recommend_page.dart | 7 +- lib/tools/home/home_chat_page.dart | 96 ++++++++++++---------- lib/tools/home_page.dart | 73 ----------------- lib/tools/me/about_page.dart | 72 ++++++++++++++++ lib/tools/me/agreement_page.dart | 75 +++++++++++++++++ lib/tools/me/me_page.dart | 40 +++++---- lib/tools/me/setting_page.dart | 118 +++++++++++++++++---------- lib/tools/message/message_model.dart | 23 ++++++ lib/tools/message/message_page.dart | 89 ++++++++++++++++---- lib/tools/shop/shop_model.dart | 2 +- pubspec.yaml | 3 + 17 files changed, 591 insertions(+), 251 deletions(-) create mode 100644 assets/images/ic_launcher.png create mode 100644 lib/dialog/restart_chat_dialog.dart create mode 100644 lib/tools/me/about_page.dart create mode 100644 lib/tools/me/agreement_page.dart diff --git a/assets/images/ic_launcher.png b/assets/images/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2da766c78b9df13fa7ee328c670a17c620040215 GIT binary patch literal 16500 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 ulDS{1XoAhuv3(2Qn_#ofXbxP createState() => _RestartChatDialogState(); +} + +class _RestartChatDialogState extends State { + @override + void initState() { + // TODO: implement initState + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Material( + type: MaterialType.transparency, //透明类型 + color: Color(0x1A000000), + child: Center( + child: ClipRRect( + borderRadius: BorderRadius.circular(7.0), + child: Container( + width: 247, + color: Color(0xFF272727), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: EdgeInsets.only(top: 28), + child: Text( + '确认重启聊天吗?\n聊天记录都将清空!', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 15, color: Color(0xFFBABABA)), + ), + ), + Container( + margin: EdgeInsets.only(top: 38, left: 22, right: 22, bottom: 19), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Container( + width: 80, + height: 28, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(14)), + border: Border.all(color: Color(0xFFFF9000), width: 1), + ), + child: Text( + '取消', + style: TextStyle(color: Color(0xFFFF9000), fontSize: 12), + ), + ), + ), + GestureDetector( + onTap: () { + Navigator.pop(context); + widget.onTap(); + }, + child: Container( + width: 80, + height: 28, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFFFF9000), + borderRadius: BorderRadius.all(Radius.circular(14)), + ), + child: Text( + '确定', + style: TextStyle(color: Colors.black, fontSize: 12), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index d3b3dc8..6c2e395 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:talk/tools/home/test_page.dart'; import 'package:talk/tools/home_page.dart'; import 'package:talk/tools/login/login_page.dart'; +import 'package:talk/tools/me/about_page.dart'; import 'package:talk/tools/me/setting_page.dart'; import 'package:talk/tools/search/search_page.dart'; import 'package:talk/tools/shop/account_page.dart'; @@ -45,6 +46,8 @@ class _ChatAppState extends State { void initState() { // TODO: implement initState super.initState(); + //白色 + SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light); } @override @@ -62,6 +65,7 @@ class _ChatAppState extends State { '/ShopPage': (BuildContext context) => const ShopPage(), '/SettingPage': (BuildContext context) => const SettingPage(), '/TestPage': (BuildContext context) => const TestPage(), + '/AboutPage': (BuildContext context) => const AboutPage(), }, debugShowMaterialGrid: false, //显示网格 diff --git a/lib/tools/chat/chat_page.dart b/lib/tools/chat/chat_page.dart index eefd79f..6e50366 100644 --- a/lib/tools/chat/chat_page.dart +++ b/lib/tools/chat/chat_page.dart @@ -10,7 +10,10 @@ import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import '../../beans/character_info_bean.dart'; import '../../beans/chat_info_bean.dart'; import '../../beans/send_message_bean.dart'; +import '../../common/func.dart'; import '../../custom/custom_popup.dart'; +import '../../dialog/delete_dialog.dart'; +import '../../dialog/restart_chat_dialog.dart'; import 'chat_info_page.dart'; import 'chat_model.dart'; @@ -174,6 +177,15 @@ class _ChatPageState extends State { @override Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final h311 = size.width / 1.1575562700964; + final h30 = size.width / 12; + final h35 = size.width / 10.285714285714; + final h23 = size.width / 15.652173913043; + final w27 = size.width / 13.333333333333; + final h70 = size.width / 5.1428571428571; + final l50 = size.width / 7.2; + return Scaffold( backgroundColor: Color(0xFF121213), body: Stack( @@ -191,7 +203,7 @@ class _ChatPageState extends State { bottom: 0, child: Container( width: MediaQuery.of(context).size.width, - height: 311.67, + height: h311, decoration: BoxDecoration( gradient: LinearGradient( colors: [Color(0x00000000), Color(0xFF0C0909)], // 三色渐变数组 @@ -222,7 +234,7 @@ class _ChatPageState extends State { ///title Container( width: double.infinity, - height: 30, + height: h30, margin: EdgeInsets.only(top: 10, left: 16, right: 16), child: Stack( alignment: Alignment.center, @@ -236,7 +248,7 @@ class _ChatPageState extends State { Positioned( left: 0, child: Container( - height: 30, + height: h30, decoration: BoxDecoration(color: Color(0x33000000), borderRadius: BorderRadius.all(Radius.circular(14))), child: Row( crossAxisAlignment: CrossAxisAlignment.center, @@ -274,7 +286,7 @@ class _ChatPageState extends State { mainAxisSize: MainAxisSize.min, children: [ SizedBox( - width: 35, + width: h35, child: Text( "${characterInfoBean?.characterName}", overflow: TextOverflow.ellipsis, @@ -282,7 +294,7 @@ class _ChatPageState extends State { ), ), SizedBox( - width: 35, + width: h35, child: Text( '${characterInfoBean?.lookCount} 聊过', style: TextStyle(fontSize: 7, color: Colors.white), @@ -436,8 +448,8 @@ class _ChatPageState extends State { Container( margin: const EdgeInsets.only(right: 7), child: text == "" - ? const Image( - width: 27, + ? Image( + width: w27, image: AssetImage('assets/images/ic_send_n.png'), ) : GestureDetector( @@ -453,7 +465,7 @@ class _ChatPageState extends State { setState(() {}); }, child: Image( - width: 27, + width: w27, image: AssetImage('assets/images/ic_send.png'), ), ), @@ -485,7 +497,7 @@ class _ChatPageState extends State { child: Container( margin: EdgeInsets.only(left: 14), child: Image( - width: 27, + width: w27, image: AssetImage('assets/images/ic_more.png'), ), ), @@ -496,37 +508,42 @@ class _ChatPageState extends State { isMore ? Container( - height: 50, + height: h70, alignment: Alignment.centerLeft, - margin: const EdgeInsets.only(left: 16, right: 16, bottom: 20), + margin: EdgeInsets.only(left: 16, right: 16, bottom: 20), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ + // Container( + // margin: EdgeInsets.only(left: 23), + // child: Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // Image(width: 26, image: AssetImage('assets/images/ic_album.png')), + // Container( + // margin: EdgeInsets.only(top: 9), + // child: Text( + // '角色相册', + // style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), + // ), + // ), + // ], + // ), + // ), Container( - margin: EdgeInsets.only(left: 23), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image(width: 26, image: AssetImage('assets/images/ic_album.png')), - Container( - margin: EdgeInsets.only(top: 9), - child: Text( - '角色相册', - style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), - ), - ), - ], - ), - ), - Container( - margin: EdgeInsets.only(left: 23), + margin: EdgeInsets.only(left: h23), child: GestureDetector( onTap: () { setState(() { isMore = false; }); - EasyLoading.show(status: 'loading...'); - _viewmodel.delChat(widget.characterId); + + FunctionUtil.popDialog(context, RestartChatDialog( + onTap: () { + EasyLoading.show(status: 'loading...'); + _viewmodel.delChat(widget.characterId); + }, + )); }, child: Column( mainAxisSize: MainAxisSize.min, @@ -544,7 +561,7 @@ class _ChatPageState extends State { ), ), Container( - margin: EdgeInsets.only(left: 23), + margin: EdgeInsets.only(left: l50), child: GestureDetector( onTap: () { setState(() { @@ -592,7 +609,7 @@ class _ChatPageState extends State { return Center( key: key, child: Container( - margin: EdgeInsets.only(left: 16, right: 16, bottom: 20), + margin: EdgeInsets.only(left: 12, right: 12, bottom: 20), padding: EdgeInsets.only(left: 20, right: 20, top: 12, bottom: 12), decoration: BoxDecoration(color: Color(0x99000000), borderRadius: BorderRadius.all(Radius.circular(13))), child: ExpandableText( @@ -675,7 +692,7 @@ class _ChatPageState extends State { margin: const EdgeInsets.symmetric(vertical: 4, horizontal: 12), padding: const EdgeInsets.all(11.0), decoration: const BoxDecoration( - color: Color(0x99FF9000), + color: Color(0xFFFF9000), borderRadius: BorderRadius.only( topRight: Radius.circular(16.0), bottomLeft: Radius.circular(16.0), bottomRight: Radius.circular(16.0)), ), @@ -683,7 +700,7 @@ class _ChatPageState extends State { chatList[index].content!, style: const TextStyle( fontSize: 14, - color: Color(0xFFE8E8E8), + color: Colors.black, ), ), ), @@ -766,9 +783,9 @@ class _ChatPageState extends State { Expanded( child: GestureDetector( onTap: () { + customController.hideMenu(); EasyLoading.showToast("内容已复制"); Clipboard.setData(ClipboardData(text: content)); - customController.hideMenu(); }, child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -788,7 +805,11 @@ class _ChatPageState extends State { child: GestureDetector( onTap: () { customController.hideMenu(); - deleteChat(id, index); + FunctionUtil.popDialog(context, DeleteDialog( + onTap: () { + deleteChat(id, index); + }, + )); }, child: Column( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/tools/find/multiplex_page.dart b/lib/tools/find/multiplex_page.dart index 63c2e87..c2bcfe9 100644 --- a/lib/tools/find/multiplex_page.dart +++ b/lib/tools/find/multiplex_page.dart @@ -75,15 +75,27 @@ class _MultiplexPageState extends State { } _item(index, CategoryInfoListBean data) { + final size = MediaQuery.of(context).size; + final w130 = size.width / 2.7692307692307; + final h50 = size.width / 7.2; + final b23 = size.width / 15.652173913043; + final w83 = size.width / 4.3373493975903; + final h115 = size.width / 3.1304347826086; + final l101 = size.width / 3.5643564356435; + final t45 = size.width / 8; + final w200 = size.width / 1.8; + final l102 = size.width / 3.5294117647058; + final h70 = size.width / 5.1428571428571; + return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { goChatPage(data.id.toString()); }, child: Container( - height: 130, - width: 50, - margin: EdgeInsets.only(bottom: 23), + height: w130, + width: h50, + margin: EdgeInsets.only(bottom: b23), decoration: BoxDecoration( color: Color(0xFF202021), borderRadius: BorderRadius.all(Radius.circular(7)), @@ -94,30 +106,29 @@ class _MultiplexPageState extends State { children: [ Positioned( left: 7, - child: - ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(15)), - child: CachedNetworkImage( - width: 83, - height: 115, - fit: BoxFit.cover, - imageUrl: data.iconImage!, - errorWidget: (context, url, error) => const Icon(Icons.error), - ), + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(15)), + child: CachedNetworkImage( + width: w83, + height: h115, + fit: BoxFit.cover, + imageUrl: data.bgImage!, + errorWidget: (context, url, error) => const Icon(Icons.error), ), + ), ), Positioned( - left: 101, + left: l101, top: 19, child: Text( '${data.name}', style: TextStyle(color: Colors.white, fontSize: 14), )), Positioned( - left: 101, - top: 45, + left: l101, + top: t45, child: SizedBox( - width: 200, + width: w200, height: 16, child: ListView.builder( itemCount: data.label?.length, @@ -127,7 +138,8 @@ class _MultiplexPageState extends State { alignment: Alignment.center, padding: EdgeInsets.symmetric(horizontal: 11), margin: EdgeInsets.only(right: 5), - decoration: BoxDecoration(border: Border.all(color: Color(0xFFFF9000)), borderRadius: BorderRadius.all(Radius.circular(7))), + decoration: BoxDecoration( + border: Border.all(color: Color(0xFFFF9000), width: 0.33), borderRadius: BorderRadius.all(Radius.circular(7))), child: Text( '${data.label?[index].name}', style: TextStyle(fontSize: 10, color: Color(0xFFFF9000)), @@ -136,10 +148,10 @@ class _MultiplexPageState extends State { }), )), Positioned( - left: 102, - top: 70, + left: l102, + top: h70, child: Container( - width: 200, + width: w200, child: Text( maxLines: 3, '${data.biography}', diff --git a/lib/tools/find/recommend_page.dart b/lib/tools/find/recommend_page.dart index 1a32906..958a086 100644 --- a/lib/tools/find/recommend_page.dart +++ b/lib/tools/find/recommend_page.dart @@ -285,7 +285,12 @@ class _RecommendPageState extends State with AutomaticKeepAliveCl alignment: Alignment.center, padding: EdgeInsets.symmetric(horizontal: 11), margin: EdgeInsets.only(right: 5), - decoration: BoxDecoration(border: Border.all(color: Color(0xFFFF9000)), borderRadius: BorderRadius.all(Radius.circular(7))), + decoration: BoxDecoration( + border: Border.all( + color: Color(0xFFFF9000), + width: 0.33, + ), + borderRadius: BorderRadius.all(Radius.circular(7))), child: Text( '${data.label?[index].name}', style: TextStyle(fontSize: 10, color: Color(0xFFFF9000)), diff --git a/lib/tools/home/home_chat_page.dart b/lib/tools/home/home_chat_page.dart index a5bae2b..340977a 100644 --- a/lib/tools/home/home_chat_page.dart +++ b/lib/tools/home/home_chat_page.dart @@ -13,6 +13,7 @@ import '../../beans/send_message_bean.dart'; import '../../common/func.dart'; import '../../custom/custom_popup.dart'; import '../../dialog/delete_dialog.dart'; +import '../../dialog/restart_chat_dialog.dart'; import '../../network/NetworkConfig.dart'; import '../chat/chat_info_page.dart'; import '../chat/chat_model.dart'; @@ -181,8 +182,11 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie final h311 = size.width / 1.1575562700964; final h30 = size.width / 12; final h35 = size.width / 10.285714285714; + final h23 = size.width / 15.652173913043; + final w27 = size.width / 13.333333333333; + final h70 = size.width / 5.1428571428571; + final l50 = size.width / 7.2; - super.build(context); return Scaffold( resizeToAvoidBottomInset: false, backgroundColor: Color(0xFF121213), @@ -230,7 +234,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie left: 0, child: Container( height: h30, - decoration: BoxDecoration(color: Color(0x33000000), borderRadius: BorderRadius.all(Radius.circular(14))), + decoration: BoxDecoration(color: Color(0x33000000), borderRadius: BorderRadius.all(Radius.circular(20))), child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, @@ -250,8 +254,8 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie margin: EdgeInsets.only(left: 2), child: ClipOval( child: CachedNetworkImage( - width: 23, - height: 23, + width: h23, + height: h23, imageUrl: '${characterInfoBean.icon}', errorWidget: (context, url, error) => const Icon(Icons.error), ), @@ -432,8 +436,8 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie Container( margin: const EdgeInsets.only(right: 7), child: text == "" - ? const Image( - width: 27, + ? Image( + width: w27, image: AssetImage('assets/images/ic_send_n.png'), ) : GestureDetector( @@ -453,7 +457,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie setState(() {}); }, child: Image( - width: 27, + width: w27, image: AssetImage('assets/images/ic_send.png'), ), ), @@ -489,7 +493,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie child: Container( margin: EdgeInsets.only(left: 14), child: Image( - width: 27, + width: w27, image: !isMore ? AssetImage('assets/images/ic_more.png') : AssetImage('assets/images/ic_more_no.png'), ), ), @@ -500,40 +504,42 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie isMore ? Container( - height: 70, + height: h70, alignment: Alignment.centerLeft, - margin: EdgeInsets.only( - left: 16, - right: 16, - ), + margin: EdgeInsets.only(left: 16, right: 16, bottom: 20), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ + // Container( + // margin: EdgeInsets.only(left: 23), + // child: Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // Image(width: 26, image: AssetImage('assets/images/ic_album.png')), + // Container( + // margin: EdgeInsets.only(top: 9), + // child: Text( + // '角色相册', + // style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), + // ), + // ), + // ], + // ), + // ), Container( - margin: EdgeInsets.only(left: 23), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image(width: 26, image: AssetImage('assets/images/ic_album.png')), - Container( - margin: EdgeInsets.only(top: 9), - child: Text( - '角色相册', - style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), - ), - ), - ], - ), - ), - Container( - margin: EdgeInsets.only(left: 23), + margin: EdgeInsets.only(left: h23), child: GestureDetector( onTap: () { setState(() { isMore = false; }); - EasyLoading.show(status: 'loading...'); - _viewmodel.delChat(widget.characterId); + + FunctionUtil.popDialog(context, RestartChatDialog( + onTap: () { + EasyLoading.show(status: 'loading...'); + _viewmodel.delChat(widget.characterId); + }, + )); }, child: Column( mainAxisSize: MainAxisSize.min, @@ -551,7 +557,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie ), ), Container( - margin: EdgeInsets.only(left: 23), + margin: EdgeInsets.only(left: l50), child: GestureDetector( onTap: () { setState(() { @@ -589,6 +595,11 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie ///聊天条目 _item(index) { + final size = MediaQuery.of(context).size; + final b20 = size.width / 18; + final l50 = size.width / 7.2; + final w135 = size.width / 2.666666666; + final h40 = size.width / 9; // if (index == 0) { // return Container(); // } @@ -633,6 +644,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie }, child: Container( padding: const EdgeInsets.only(left: 9, right: 9, top: 6, bottom: 6), + margin: EdgeInsets.only(bottom: b20), decoration: const BoxDecoration( color: Color(0xCC000000), borderRadius: BorderRadius.all(Radius.circular(15)), @@ -640,7 +652,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie child: Row( mainAxisSize: MainAxisSize.min, children: [ - Text(chatList[index].content!, style: TextStyle(color: Color(0xFFB6B6B6), fontSize: 10)), + Text(chatList[index].content!, style: const TextStyle(color: Color(0xFFB6B6B6), fontSize: 10)), Container( margin: const EdgeInsets.only(left: 10), child: const Text("立即增加", style: TextStyle(color: Color(0xFFFF9000), fontSize: 10)), @@ -666,12 +678,12 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie children: [ ConstrainedBox( constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).size.width - 50, // 确保不超过屏幕宽度 + maxWidth: MediaQuery.of(context).size.width - l50, // 确保不超过屏幕宽度 ), child: CustomPopup( controller: customController, menuBuilder: () { - return popupView(chatList[index].id!, chatList[index].content!, index, customController); + return popupView(chatList[index].id!, chatList[index].content!, index, customController, w135, h40); }, barrierColor: Colors.transparent, //触发方式 @@ -680,7 +692,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie margin: const EdgeInsets.symmetric(vertical: 4, horizontal: 12), padding: const EdgeInsets.all(11.0), decoration: const BoxDecoration( - color: Color(0x99FF9000), + color: Color(0xFFFF9000), borderRadius: BorderRadius.only( topRight: Radius.circular(16.0), bottomLeft: Radius.circular(16.0), bottomRight: Radius.circular(16.0)), ), @@ -688,7 +700,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie chatList[index].content!, style: const TextStyle( fontSize: 14, - color: Color(0xFFE8E8E8), + color: Colors.black, ), ), ), @@ -733,7 +745,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie children: [ ConstrainedBox( constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).size.width - 50, // 确保不超过屏幕宽度 + maxWidth: MediaQuery.of(context).size.width - l50, // 确保不超过屏幕宽度 ), child: Container( margin: const EdgeInsets.symmetric(vertical: 4, horizontal: 12), @@ -757,10 +769,10 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie ); } - popupView(int id, String content, index, customController) { + popupView(int id, String content, index, customController, w135, h40) { return Container( - width: 135, - height: 40, + width: w135, + height: h40, decoration: BoxDecoration( color: Color(0xFF222222), borderRadius: BorderRadius.all(Radius.circular(2)), diff --git a/lib/tools/home_page.dart b/lib/tools/home_page.dart index 5a13732..eb708fb 100644 --- a/lib/tools/home_page.dart +++ b/lib/tools/home_page.dart @@ -53,79 +53,6 @@ class _HomePageState extends State with SingleTickerProviderStateMixin MePage(), ], ), - // Positioned( - // bottom: 0, - // child: Container( - // width: MediaQuery.of(context).size.width, - // height: 60, - // color: Color(currentIndex != 0 ? 0xFF121213 : 0x121213), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.spaceAround, - // children: [ - // GestureDetector( - // onTap: () { - // currentIndex = 0; - // _tabController.animateTo(0); - // setState(() {}); - // }, - // child: Text( - // '首页', - // style: TextStyle(color: Color(currentIndex == 0 ? 0xFFFFFFFF : 0xFF7E7E7E)), - // ), - // ), - // GestureDetector( - // onTap: () { - // if (NetworkConfig.userId == "") { - // Navigator.of(context).pushNamed('/LoginPage'); - // return; - // } - // - // currentIndex = 1; - // _tabController.animateTo(1); - // setState(() {}); - // }, - // child: Text( - // '发现', - // style: TextStyle(color: Color(currentIndex == 1 ? 0xFFFFFFFF : 0xFF7E7E7E)), - // ), - // ), - // Image( - // width: 32, - // image: AssetImage('assets/images/ic_create.png'), - // ), - // GestureDetector( - // onTap: () { - // if (NetworkConfig.userId == "") { - // Navigator.of(context).pushNamed('/LoginPage'); - // return; - // } - // currentIndex = 2; - // _tabController.animateTo(2); - // setState(() {}); - // }, - // child: Text( - // '消息', - // style: TextStyle(color: Color(currentIndex == 2 ? 0xFFFFFFFF : 0xFF7E7E7E)), - // ), - // ), - // GestureDetector( - // onTap: () { - // if (NetworkConfig.userId == "") { - // Navigator.of(context).pushNamed('/LoginPage'); - // return; - // } - // currentIndex = 3; - // _tabController.animateTo(3); - // setState(() {}); - // }, - // child: Text( - // '我的', - // style: TextStyle(color: Color(currentIndex == 3 ? 0xFFFFFFFF : 0xFF7E7E7E)), - // ), - // ), - // ], - // ), - // )) ], ), bottomNavigationBar: Theme( diff --git a/lib/tools/me/about_page.dart b/lib/tools/me/about_page.dart new file mode 100644 index 0000000..4740fbd --- /dev/null +++ b/lib/tools/me/about_page.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +class AboutPage extends StatefulWidget { + const AboutPage({super.key}); + + @override + State createState() => _AboutPageState(); +} + +class _AboutPageState extends State { + String version = ''; + + @override + void initState() { + // TODO: implement initState + super.initState(); + + getCode(); + } + + getCode() async { + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + + String appName = packageInfo.appName; + String packageName = packageInfo.packageName; + version = packageInfo.version; + String buildNumber = packageInfo.buildNumber; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Color(0xFF121213), + appBar: AppBar( + backgroundColor: Color(0xFF121213), + scrolledUnderElevation: 0.0, + title: Text( + '关于', + style: TextStyle(fontSize: 16, color: Colors.white), + ), + centerTitle: true, + leading: IconButton( + iconSize: 18, + icon: Icon(Icons.arrow_back_ios_sharp), + color: Colors.white, + onPressed: () { + // 处理返回操作 + Navigator.pop(context); + }, + ), + ), + body: Column( + children: [ + Container( + alignment: Alignment.center, + margin: EdgeInsets.only(top: 68), + child: Image(width: 70, height: 70, image: AssetImage('assets/images/ic_launcher.png')), + ), + Container( + margin: EdgeInsets.only(top: 17), + child: Text( + version, + style: TextStyle(fontSize: 12, color: Color(0xFF858585)), + ), + ) + ], + ), + ); + } +} diff --git a/lib/tools/me/agreement_page.dart b/lib/tools/me/agreement_page.dart new file mode 100644 index 0000000..5b2bb94 --- /dev/null +++ b/lib/tools/me/agreement_page.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +///协议 +class AgreementPage extends StatefulWidget { + String title; + String url; + + AgreementPage({required this.title, required this.url}); + + @override + State createState() => _AgreementPageState(); +} + +class _AgreementPageState extends State { + late WebViewController controller; + + @override + void initState() { + // TODO: implement initState + super.initState(); + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + // Update loading bar. + }, + onPageStarted: (String url) {}, + onPageFinished: (String url) {}, + onHttpError: (HttpResponseError error) {}, + onWebResourceError: (WebResourceError error) {}, + onNavigationRequest: (NavigationRequest request) { + // if (request.url.startsWith('https://www.youtube.com/')) { + // return NavigationDecision.prevent; + // } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.url)); + } + + @override + void dispose() { + // TODO: implement dispose + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Color(0xFF121213), + scrolledUnderElevation: 0.0, + title: Text( + widget.title, + style: TextStyle(fontSize: 16, color: Colors.white), + ), + centerTitle: true, + leading: IconButton( + iconSize: 18, + icon: Icon(Icons.arrow_back_ios_sharp), + color: Colors.white, + onPressed: () { + // 处理返回操作 + Navigator.pop(context); + }, + ), + ), + body: WebViewWidget(controller: controller), + ); + } +} diff --git a/lib/tools/me/me_page.dart b/lib/tools/me/me_page.dart index 2b7fe43..f91aaba 100644 --- a/lib/tools/me/me_page.dart +++ b/lib/tools/me/me_page.dart @@ -59,6 +59,13 @@ class _MePageState extends State { @override Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final w21 = size.width / 17.142857142857; + final t38 = size.width / 9.4736842105263; + final w58 = size.width / 6.2068965517241; + final l80 = size.width / 4.5; + final h50 = size.width / 7.2; + return Scaffold( backgroundColor: Color(0xFF121213), body: SingleChildScrollView( @@ -87,8 +94,8 @@ class _MePageState extends State { Navigator.pushNamed(context, '/SettingPage'); }, child: Image( - width: 21, - height: 21, + width: w21, + height: w21, image: AssetImage('assets/images/ic_setting.png'), ), )) @@ -98,27 +105,27 @@ class _MePageState extends State { Container( width: double.infinity, - margin: EdgeInsets.only(left: 18, right: 18, top: 38), + margin: EdgeInsets.only(left: 18, right: 18, top: t38), child: Stack( children: [ ClipOval( child: CachedNetworkImage( - width: 58, - height: 58, + width: w58, + height: w58, imageUrl: userInfoBean.userIconUrl!, errorWidget: (context, url, error) => const Icon(Icons.error), ), ), Positioned( top: 5, - left: 80, + left: l80, child: Text( '${userInfoBean.nickName}', style: TextStyle(fontSize: 15, color: Color(0xFFE1E1E1)), )), Positioned( bottom: 6, - left: 80, + left: l80, child: Text( 'id ${userInfoBean.userId}', style: TextStyle(fontSize: 13, color: Color(0xFF4D4D4D)), @@ -141,12 +148,9 @@ class _MePageState extends State { // style: TextStyle(color: Color(0xFF4D4D4D), fontSize: 12), // ), // ), - Container( - // margin: EdgeInsets.only(left: 18), - child: Text( - '${userInfoBean.remainingChatCount}', - style: TextStyle(color: Colors.white, fontSize: 16), - ), + Text( + '${userInfoBean.remainingChatCount}', + style: TextStyle(color: Colors.white, fontSize: 16), ), Container( margin: EdgeInsets.only(left: 6), @@ -171,7 +175,7 @@ class _MePageState extends State { Navigator.pushNamed(context, '/AccountPage'); }, child: Container( - height: 38, + height: t38, decoration: BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(13))), child: Row( children: [ @@ -202,7 +206,7 @@ class _MePageState extends State { Navigator.pushNamed(context, '/ShopPage'); }, child: Container( - height: 38, + height: t38, decoration: BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(13))), child: Row( children: [ @@ -215,9 +219,9 @@ class _MePageState extends State { ), ), Container( - margin: EdgeInsets.only(left: 24), + margin: EdgeInsets.only(left: 35), child: Text( - '货币商城', + '商城', style: TextStyle(color: Color(0xFFE1E1E1), fontSize: 13), ), ), @@ -231,7 +235,7 @@ class _MePageState extends State { ), Container( - height: 50, + height: h50, margin: EdgeInsets.symmetric(horizontal: 16), child: GestureDetector( onTap: () { diff --git a/lib/tools/me/setting_page.dart b/lib/tools/me/setting_page.dart index e41c14e..fe27f65 100644 --- a/lib/tools/me/setting_page.dart +++ b/lib/tools/me/setting_page.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'agreement_page.dart'; + class SettingPage extends StatefulWidget { const SettingPage({super.key}); @@ -37,60 +39,92 @@ class _SettingApgeState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container( - height: 50, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - '关于', - style: TextStyle(fontSize: 13, color: Colors.white), - ), - Icon( - Icons.keyboard_arrow_right, - color: Color(0xFF6F6F6F), - ), - ], + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.pushNamed(context, '/AboutPage'); + }, + child: SizedBox( + height: 50, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '关于', + style: TextStyle(fontSize: 13, color: Colors.white), + ), + Icon( + Icons.keyboard_arrow_right, + color: Color(0xFF6F6F6F), + ), + ], + ), ), ), Container( height: 0.33, color: Color(0xFF3A3A3A), ), - Container( - height: 50, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - '用户协议', - style: TextStyle(fontSize: 13, color: Colors.white), - ), - Icon( - Icons.keyboard_arrow_right, - color: Color(0xFF6F6F6F), - ), - ], + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AgreementPage( + title: "用户协议", + url: "https://shhuanmeng.com/yonghuxieyi.html", + )), + ); + }, + child: Container( + height: 50, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '用户协议', + style: TextStyle(fontSize: 13, color: Colors.white), + ), + Icon( + Icons.keyboard_arrow_right, + color: Color(0xFF6F6F6F), + ), + ], + ), ), ), Container( height: 0.33, color: Color(0xFF3A3A3A), ), - Container( - height: 50, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - '隐私协议', - style: TextStyle(fontSize: 13, color: Colors.white), - ), - Icon( - Icons.keyboard_arrow_right, - color: Color(0xFF6F6F6F), - ), - ], + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AgreementPage( + title: "隐私协议", + url: "https://shhuanmeng.com/yinsixieyi.html", + )), + ); + }, + child: Container( + height: 50, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '隐私协议', + style: TextStyle(fontSize: 13, color: Colors.white), + ), + Icon( + Icons.keyboard_arrow_right, + color: Color(0xFF6F6F6F), + ), + ], + ), ), ), Container( diff --git a/lib/tools/message/message_model.dart b/lib/tools/message/message_model.dart index 5a8b864..f720f77 100644 --- a/lib/tools/message/message_model.dart +++ b/lib/tools/message/message_model.dart @@ -39,4 +39,27 @@ class MessageModel { print("errorEntity==${errorEntity.message}"); }); } + + ///清空聊天信息(重启聊天) + Future delChat(characterId) async { + RequestCenter.instance.request(NetworkConfig.delChat, { + "characterId": characterId, + }, (BaseEntity dataEntity) { + print("dataEntity==$dataEntity"); + + if (dataEntity.code == 0) { + streamController.sink.add({ + 'code': "delChat", //有数据 + 'data': dataEntity.data + }); + } else { + streamController.sink.add({ + 'code': "-1", //有数据 + 'data': dataEntity.message + }); + } + }, (ErrorEntity errorEntity) { + print("errorEntity==${errorEntity.message}"); + }); + } } diff --git a/lib/tools/message/message_page.dart b/lib/tools/message/message_page.dart index 07743d0..4cafc33 100644 --- a/lib/tools/message/message_page.dart +++ b/lib/tools/message/message_page.dart @@ -4,9 +4,12 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; +import 'package:intl/intl.dart'; import 'package:talk/beans/message_bean.dart'; import 'package:talk/tools/message/message_model.dart'; +import '../../common/func.dart'; +import '../../dialog/restart_chat_dialog.dart'; import '../chat/chat_page.dart'; ///消息列表 @@ -24,6 +27,8 @@ class _MessagePageState extends State { final MessageModel _viewmodel = MessageModel(); + int delIndex = 0; + @override void initState() { // TODO: implement initState @@ -36,8 +41,12 @@ class _MessagePageState extends State { case "getChatHistoryList": messageList = newData['data']; break; + case "delChat": //重启对话 + if (newData['data']) { + messageList.removeAt(delIndex); + } + break; default: - EasyLoading.dismiss(); EasyLoading.showToast(newData['data']); break; } @@ -84,7 +93,7 @@ class _MessagePageState extends State { child: ListView.builder( itemCount: messageList.length, itemBuilder: (BuildContext context, int index) { - return _item(messageList[index], context); + return _item(messageList[index], context, index); }), ), )) @@ -95,14 +104,22 @@ class _MessagePageState extends State { ); } - _item(MessageBean data, BuildContext context) { + _item(MessageBean data, BuildContext context, index) { + final size = MediaQuery.of(context).size; + final h50 = size.width / 7.2; + final b20 = size.width / 18; + final w40 = size.width / 9; + final l68 = size.width / 5.2941176470588; + final t25 = size.width / 14.4; + final w160 = size.width / 2.25; + return Slidable( //左滑划出的菜单 endActionPane: ActionPane( key: Key(UniqueKey().toString()), // 菜单宽度 extentRatio: 0.3, - dragDismissible: false, + // dragDismissible: false, // 滑动动效 // DrawerMotion() StretchMotion() // motion: ScrollMotion(), @@ -110,7 +127,15 @@ class _MessagePageState extends State { motion: BehindMotion(), children: [ SlidableAction( - onPressed: doNothing(context, data.id), + onPressed: (BuildContext context) { + FunctionUtil.popDialog(context, RestartChatDialog( + onTap: () { + delIndex = index; + EasyLoading.show(status: 'loading...'); + _viewmodel.delChat(data.id); + }, + )); + }, backgroundColor: Color(0xFFFF9000), foregroundColor: Colors.black, label: '删除', @@ -130,8 +155,8 @@ class _MessagePageState extends State { ); }, child: Container( - height: 50, - margin: EdgeInsets.only(bottom: 10), + height: h50, + margin: EdgeInsets.only(bottom: b20), child: Stack( alignment: Alignment.center, children: [ @@ -140,25 +165,25 @@ class _MessagePageState extends State { left: 16, child: ClipOval( child: CachedNetworkImage( - width: 40, - height: 40, + width: w40, + height: w40, imageUrl: data.iconImage!, errorWidget: (context, url, error) => const Icon(Icons.error), ), ), ), Positioned( - left: 68, + left: l68, top: 6, child: Text( data.name!, style: TextStyle(fontSize: 13, color: Color(0xFFE1E1E1)), )), Positioned( - left: 68, - top: 25, + left: l68, + top: t25, child: Container( - width: 160, + width: w160, child: Text( '${data.lastMessage}', maxLines: 1, @@ -171,7 +196,7 @@ class _MessagePageState extends State { top: 6, child: Container( child: Text( - '${data.lastContactTime}', + '${getHM(data.lastContactTime)}', style: TextStyle(fontSize: 10, color: Color(0xFF8D8D8D)), ), )), @@ -181,8 +206,38 @@ class _MessagePageState extends State { ), ); } -} -doNothing(BuildContext context, id) { - // EasyLoading.showToast("删除"); + doNothing(BuildContext context, id, index) { + print("object"); + delIndex = index; + EasyLoading.show(status: 'loading...'); + _viewmodel.delChat(id); + EasyLoading.showToast("status"); + } + + ///提取时间 + getHM(dateTimeString) { + DateTime inputDateTime = DateTime.parse(dateTimeString); + DateTime now = DateTime.now(); + + bool isToday = inputDateTime.year == now.year && inputDateTime.month == now.month && inputDateTime.day == now.day; + bool isThisYear = inputDateTime.year == now.year; + + String formattedDateTime; + if (isToday) { + // 当天内,只显示【时:分】 + final DateFormat timeFormatter = DateFormat('HH:mm'); + formattedDateTime = timeFormatter.format(inputDateTime); + } else if (isThisYear) { + // 超出当天但仍在今年内,显示【月-日 时:分】 + final DateFormat dateFormatter = DateFormat('MM-dd HH:mm'); + formattedDateTime = dateFormatter.format(inputDateTime); + } else { + // 超出今年,显示【年-月-日 时:分】 + final DateFormat fullDateFormatter = DateFormat('yyyy-MM-dd HH:mm'); + formattedDateTime = fullDateFormatter.format(inputDateTime); + } + + return formattedDateTime; + } } diff --git a/lib/tools/shop/shop_model.dart b/lib/tools/shop/shop_model.dart index bd1903e..b7041af 100644 --- a/lib/tools/shop/shop_model.dart +++ b/lib/tools/shop/shop_model.dart @@ -60,7 +60,7 @@ class ShopModel { }); } - ///交易记录 + ///货币商城 Future getMallItem() async { RequestCenter.instance.requestGet(NetworkConfig.getMallItem, {}, (BaseEntity dataEntity) { if (dataEntity.code == 0) { diff --git a/pubspec.yaml b/pubspec.yaml index 001a31f..1cb6182 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,6 +28,7 @@ dependencies: dio: ^5.4.3+1 + intl: ^0.19.0 cupertino_icons: ^1.0.6 flutter_easyloading: ^3.0.5 flutter_spinkit: ^5.2.1 @@ -47,6 +48,8 @@ dependencies: card_swiper: ^3.0.1 flutter_slidable: ^3.1.0 flutter_keyboard_visibility: ^6.0.0 + webview_flutter: ^4.8.0 + package_info_plus: ^8.0.0 dev_dependencies: flutter_test: