From e4bb070d0848b6212e7d30779620542ddace92a6 Mon Sep 17 00:00:00 2001 From: 18631081161 <2088094923@qq.com> Date: Thu, 18 Jul 2024 14:57:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E5=88=97=E8=A1=A8=E4=BC=98?= =?UTF-8?q?=E5=8C=96,=E9=80=82=E9=85=8D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 16500 bytes .../src/main/res/mipmap-xxhdpi/img_start.png | Bin 14045 -> 26698 bytes assets/images/img_start.png | Bin 14045 -> 26698 bytes lib/tools/chat/chat_page.dart | 37 +- lib/tools/find/multiplex_page.dart | 139 ++-- lib/tools/find/recommend_page.dart | 277 ++++---- lib/tools/home/home_chat_page.dart | 637 ++++++++++-------- lib/tools/home_page.dart | 14 + lib/tools/login/login_page.dart | 295 ++++---- lib/tools/start_page.dart | 5 +- pubspec.yaml | 1 + 11 files changed, 756 insertions(+), 649 deletions(-) diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..2da766c78b9df13fa7ee328c670a17c620040215 100644 GIT binary patch literal 16500 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 b7{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxhdpi/img_start.png b/android/app/src/main/res/mipmap-xxhdpi/img_start.png index 47bc3e278fc508282f44272ee5a68d127e83c0c6..1727e5aeadf54dd353239bfa242f7e5dff81092c 100644 GIT binary patch literal 26698 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 bu^$RD!DZBL3L<71_+oMqd8~x;JdB diff --git a/assets/images/img_start.png b/assets/images/img_start.png index 47bc3e278fc508282f44272ee5a68d127e83c0c6..1727e5aeadf54dd353239bfa242f7e5dff81092c 100644 GIT binary patch literal 26698 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 bu^$RD!DZBL3L<71_+oMqd8~x;JdB diff --git a/lib/tools/chat/chat_page.dart b/lib/tools/chat/chat_page.dart index 2c9bd17..0b66286 100644 --- a/lib/tools/chat/chat_page.dart +++ b/lib/tools/chat/chat_page.dart @@ -4,6 +4,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:expandable_text/expandable_text.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import '../../beans/character_info_bean.dart'; import '../../beans/chat_info_bean.dart'; @@ -52,12 +53,15 @@ class _ChatPageState extends State { int delIndex = 0; + ///聊天列表滑动到底部 void _scrollToBottom() { - _scrollController.animateTo( - _scrollController.position.maxScrollExtent, - curve: Curves.easeOut, - duration: const Duration(milliseconds: 300), - ); + Future.delayed(Duration(milliseconds: 300), () { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent, + curve: Curves.easeOut, + duration: const Duration(milliseconds: 300), + ); + }); } @override @@ -77,9 +81,7 @@ class _ChatPageState extends State { chatList.addAll(newData['data']); EasyLoading.dismiss(); setState(() {}); - Future.delayed(Duration(milliseconds: 100), () { - _scrollToBottom(); - }); + _scrollToBottom(); break; case "sendMessage": sendMessageBean = newData['data']; @@ -122,6 +124,21 @@ class _ChatPageState extends State { } }); + // 创建键盘可见性监测器 + final keyboardVisibilityController = KeyboardVisibilityController(); + // 订阅键盘可见性变化 + keyboardVisibilityController.onChange.listen((bool visible) { + // 在这里处理键盘可见性变化的逻辑 + if (visible) { + // 键盘弹出时的处理逻辑 + print('Keyboard is visible'); + _scrollToBottom(); + } else { + // 键盘隐藏时的处理逻辑 + print('Keyboard is hidden'); + } + }); + loadData(); } @@ -155,7 +172,9 @@ class _ChatPageState extends State { children: [ characterInfoBean != null && characterInfoBean?.bgUrl != null ? CachedNetworkImage( - fit: BoxFit.fitHeight, + fit: BoxFit.cover, + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, imageUrl: "${characterInfoBean?.bgUrl}", errorWidget: (context, url, error) => const Icon(Icons.error), ) diff --git a/lib/tools/find/multiplex_page.dart b/lib/tools/find/multiplex_page.dart index b328cae..1259d52 100644 --- a/lib/tools/find/multiplex_page.dart +++ b/lib/tools/find/multiplex_page.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import '../../beans/category_info_list_bean.dart'; +import '../chat/chat_page.dart'; import 'find_model.dart'; class MultiplexPage extends StatefulWidget { @@ -51,6 +52,16 @@ class _MultiplexPageState extends State { super.dispose(); } + goChatPage(String id) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ChatPage( + characterId: id, + )), + ); + } + @override Widget build(BuildContext context) { return Container( @@ -64,69 +75,75 @@ class _MultiplexPageState extends State { } _item(index, CategoryInfoListBean data) { - return Container( - height: 130, - width: 50, - margin: EdgeInsets.only(bottom: 23), - decoration: BoxDecoration( - color: Color(0xFF202021), - borderRadius: BorderRadius.all(Radius.circular(7)), - border: Border.all(color: Color(0xFF7E7E7E), width: 0.3), - ), - child: Stack( - alignment: Alignment.center, - children: [ - Positioned( - left: 7, - child: CachedNetworkImage( - width: 83, - height: 115, - imageUrl: data.iconImage!, - errorWidget: (context, url, error) => const Icon(Icons.error), + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + goChatPage(data.id.toString()); + }, + child: Container( + height: 130, + width: 50, + margin: EdgeInsets.only(bottom: 23), + decoration: BoxDecoration( + color: Color(0xFF202021), + borderRadius: BorderRadius.all(Radius.circular(7)), + border: Border.all(color: Color(0xFF7E7E7E), width: 0.3), + ), + child: Stack( + alignment: Alignment.center, + children: [ + Positioned( + left: 7, + child: CachedNetworkImage( + width: 83, + height: 115, + imageUrl: data.iconImage!, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), ), - ), - Positioned( - left: 101, - top: 19, - child: Text( - '${data.name}', - style: TextStyle(color: Colors.white, fontSize: 14), - )), - Positioned( - left: 101, - top: 45, - child: SizedBox( - width: 200, - height: 16, - child: ListView.builder( - itemCount: data.label?.length, - scrollDirection: Axis.horizontal, - itemBuilder: (BuildContext context, int index) { - return Container( - 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))), - child: Text( - '${data.label?[index].name}', - style: TextStyle(fontSize: 10, color: Color(0xFFFF9000)), - ), - ); - }), - )), - Positioned( - left: 102, - top: 70, - child: Container( - width: 200, + Positioned( + left: 101, + top: 19, child: Text( - maxLines: 3, - '${data.biography}', - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Colors.white, fontSize: 10), - ), - )) - ], + '${data.name}', + style: TextStyle(color: Colors.white, fontSize: 14), + )), + Positioned( + left: 101, + top: 45, + child: SizedBox( + width: 200, + height: 16, + child: ListView.builder( + itemCount: data.label?.length, + scrollDirection: Axis.horizontal, + itemBuilder: (BuildContext context, int index) { + return Container( + 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))), + child: Text( + '${data.label?[index].name}', + style: TextStyle(fontSize: 10, color: Color(0xFFFF9000)), + ), + ); + }), + )), + Positioned( + left: 102, + top: 70, + child: Container( + width: 200, + child: Text( + maxLines: 3, + '${data.biography}', + overflow: TextOverflow.ellipsis, + style: TextStyle(color: Colors.white, fontSize: 10), + ), + )) + ], + ), ), ); } diff --git a/lib/tools/find/recommend_page.dart b/lib/tools/find/recommend_page.dart index 581fdaf..42131b4 100644 --- a/lib/tools/find/recommend_page.dart +++ b/lib/tools/find/recommend_page.dart @@ -8,6 +8,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; import '../../beans/find_banner_bean.dart'; import '../../beans/recommend_bean.dart'; import '../../custom/custom_swiper_pagination.dart'; +import '../chat/chat_page.dart'; import 'find_model.dart'; ///推荐 @@ -18,7 +19,7 @@ class RecommendPage extends StatefulWidget { State createState() => _RecommendPageState(); } -class _RecommendPageState extends State { +class _RecommendPageState extends State with AutomaticKeepAliveClientMixin { late StreamSubscription subscription; final FindModel _viewmodel = FindModel(); @@ -74,6 +75,16 @@ class _RecommendPageState extends State { super.dispose(); } + goChatPage(String id) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ChatPage( + characterId: id, + )), + ); + } + @override Widget build(BuildContext context) { return Stack( @@ -92,10 +103,15 @@ class _RecommendPageState extends State { return Container( key: ValueKey(index), padding: EdgeInsets.only(bottom: 30), - child: CachedNetworkImage( - fit: BoxFit.fill, - imageUrl: bannerList[index].imageUrl!, - errorWidget: (context, url, error) => const Icon(Icons.error), + child: GestureDetector( + onTap: () { + goChatPage(bannerList[index].actionId.toString()); + }, + child: CachedNetworkImage( + fit: BoxFit.fill, + imageUrl: bannerList[index].imageUrl!, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), ), ); }, @@ -115,19 +131,35 @@ class _RecommendPageState extends State { style: TextStyle(color: Colors.white, fontSize: 16), ), ), - Container( - margin: EdgeInsets.only(top: 21), - height: 360, - child: ListView.builder( - itemCount: recommendList.length, - scrollDirection: Axis.horizontal, - itemBuilder: (BuildContext context, int index) { - return _item(index, recommendList[index]); - }), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Container( + // width: 500, + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(top: 21), + padding: EdgeInsets.only(left: 16), + height: 330, + child: GridView.count( + shrinkWrap: true, + //水平子Widget之间间距 + crossAxisSpacing: 12.0, + //垂直子Widget之间间距 + mainAxisSpacing: 9.0, + //GridView内边距 + padding: EdgeInsets.zero, + //一行的Widget数量 + crossAxisCount: 2, + //子Widget宽高比例 + childAspectRatio: 1.4, + //子Widget列表 + children: _item(recommendList), + physics: NeverScrollableScrollPhysics(), + //类似 cellForRow 函数 + scrollDirection: Axis.horizontal)), ), Container( alignment: Alignment.centerLeft, - margin: EdgeInsets.only(left: 16), + margin: EdgeInsets.only(left: 16, top: 34), child: Text( '热门小说角色', style: TextStyle(color: Colors.white, fontSize: 16), @@ -150,48 +182,17 @@ class _RecommendPageState extends State { ], ); } -} -_item(int index, RecommendBean data) { - return Container( - margin: EdgeInsets.only(right: 9, left: index == 0 ? 16 : 0), - child: Column( - children: [ - Stack( - children: [ - ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(15)), - child: CachedNetworkImage( - width: 113, - height: 159, - fit: BoxFit.fill, - imageUrl: data.imageUrl!, - errorWidget: (context, url, error) => const Icon(Icons.error), - ), - ), - Positioned( - left: 7, - bottom: 21, - child: Text( - '${data.name}', - style: TextStyle(color: Colors.white, fontSize: 12), - )), - Positioned( - left: 7, - bottom: 9, - child: Container( - width: 105, - child: Text( - '${data.biography}', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Color(0xFFC2C2C2), fontSize: 9), - ), - )), - ], - ), - Container( - margin: EdgeInsets.only(top: 12), + _item(List list) { + return list.map((res) { + int index = recommendList.indexOf(res); + return GestureDetector( + onTap: () { + goChatPage(res.id.toString()); + }, + child: Container( + alignment: Alignment.center, + // margin: EdgeInsets.only(right: 9, left: 16), child: Stack( children: [ ClipRRect( @@ -200,7 +201,7 @@ _item(int index, RecommendBean data) { width: 113, height: 159, fit: BoxFit.fill, - imageUrl: data.imageUrl!, + imageUrl: res.imageUrl!, errorWidget: (context, url, error) => const Icon(Icons.error), ), ), @@ -208,7 +209,7 @@ _item(int index, RecommendBean data) { left: 7, bottom: 21, child: Text( - '${data.name}', + '${res.name}', style: TextStyle(color: Colors.white, fontSize: 12), )), Positioned( @@ -217,7 +218,7 @@ _item(int index, RecommendBean data) { child: Container( width: 105, child: Text( - '${data.biography}', + '${res.biography}', maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(color: Color(0xFFC2C2C2), fontSize: 9), @@ -225,80 +226,90 @@ _item(int index, RecommendBean data) { )), ], ), - ) - ], - ), - ); -} - -_item2(index, RecommendBean data) { - return Container( - height: 130, - width: 50, - margin: EdgeInsets.only(bottom: 20), - decoration: BoxDecoration( - color: Color(0xFF202021), - borderRadius: BorderRadius.all(Radius.circular(7)), - border: Border.all(color: Color(0xFF7E7E7E), width: 0.3), - ), - child: Stack( - alignment: Alignment.center, - children: [ - Positioned( - left: 7, - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(15)), - child: CachedNetworkImage( - width: 83, - height: 115, - fit: BoxFit.fill, - imageUrl: data.imageUrl!, - errorWidget: (context, url, error) => const Icon(Icons.error), - ), - ), ), - Positioned( - left: 101, - top: 19, - child: Text( - '${data.name}', - style: TextStyle(color: Colors.white, fontSize: 14), - )), - Positioned( - left: 101, - top: 45, - child: SizedBox( - width: 200, - height: 16, - child: ListView.builder( - itemCount: data.label?.length, - scrollDirection: Axis.horizontal, - itemBuilder: (BuildContext context, int index) { - return Container( - 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))), - child: Text( - '${data.label?[index].name}', - style: TextStyle(fontSize: 10, color: Color(0xFFFF9000)), - ), - ); - }), - )), - Positioned( - left: 102, - top: 70, - child: Container( - width: 200, - child: Text( - maxLines: 3, - '${data.biography}', - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Colors.white, fontSize: 10), + ); + }).toList(); + } + + _item2(index, RecommendBean data) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + goChatPage(data.id.toString()); + }, + child: Container( + height: 130, + width: 50, + margin: EdgeInsets.only(bottom: 20), + decoration: BoxDecoration( + color: Color(0xFF202021), + borderRadius: BorderRadius.all(Radius.circular(7)), + border: Border.all(color: Color(0xFF7E7E7E), width: 0.3), + ), + child: Stack( + alignment: Alignment.center, + children: [ + Positioned( + left: 7, + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(15)), + child: CachedNetworkImage( + width: 83, + height: 115, + fit: BoxFit.fill, + imageUrl: data.imageUrl!, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), ), - )) - ], - ), - ); + ), + Positioned( + left: 101, + top: 19, + child: Text( + '${data.name}', + style: TextStyle(color: Colors.white, fontSize: 14), + )), + Positioned( + left: 101, + top: 45, + child: SizedBox( + width: 200, + height: 16, + child: ListView.builder( + itemCount: data.label?.length, + scrollDirection: Axis.horizontal, + itemBuilder: (BuildContext context, int index) { + return Container( + 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))), + child: Text( + '${data.label?[index].name}', + style: TextStyle(fontSize: 10, color: Color(0xFFFF9000)), + ), + ); + }), + )), + Positioned( + left: 102, + top: 70, + child: Container( + width: 200, + child: Text( + maxLines: 3, + '${data.biography}', + overflow: TextOverflow.ellipsis, + style: TextStyle(color: Colors.white, fontSize: 10), + ), + )) + ], + ), + ), + ); + } + + @override + // TODO: implement wantKeepAlive + bool get wantKeepAlive => true; } diff --git a/lib/tools/home/home_chat_page.dart b/lib/tools/home/home_chat_page.dart index 6c2264b..057a1eb 100644 --- a/lib/tools/home/home_chat_page.dart +++ b/lib/tools/home/home_chat_page.dart @@ -4,10 +4,12 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:expandable_text/expandable_text.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +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 '../../network/NetworkConfig.dart'; import '../chat/chat_info_page.dart'; import '../chat/chat_model.dart'; @@ -20,7 +22,7 @@ class HomeChatPage extends StatefulWidget { State createState() => _HomeChatPageState(); } -class _HomeChatPageState extends State with AutomaticKeepAliveClientMixin { +class _HomeChatPageState extends State with AutomaticKeepAliveClientMixin, WidgetsBindingObserver { final ScrollController _scrollController = ScrollController(); final TextEditingController _chatController = TextEditingController(); @@ -69,9 +71,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie case "getChatInfo": chatList.addAll(newData['data']); setState(() {}); - Future.delayed(Duration(milliseconds: 100), () { - _scrollToBottom(); - }); + _scrollToBottom(); EasyLoading.dismiss(); break; case "sendMessage": @@ -115,6 +115,21 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie } }); + // 创建键盘可见性监测器 + final keyboardVisibilityController = KeyboardVisibilityController(); + // 订阅键盘可见性变化 + keyboardVisibilityController.onChange.listen((bool visible) { + // 在这里处理键盘可见性变化的逻辑 + if (visible) { + // 键盘弹出时的处理逻辑 + print('Keyboard is visible'); + _scrollToBottom(); + } else { + // 键盘隐藏时的处理逻辑 + print('Keyboard is hidden'); + } + }); + loadData(); } @@ -131,12 +146,15 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie _viewmodel.delChatByIds(ids, widget.characterId); } + ///聊天列表滑动到底部 void _scrollToBottom() { - _scrollController.animateTo( - _scrollController.position.maxScrollExtent, - curve: Curves.easeOut, - duration: const Duration(milliseconds: 300), - ); + Future.delayed(Duration(milliseconds: 300), () { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent, + curve: Curves.easeOut, + duration: const Duration(milliseconds: 300), + ); + }); } @override @@ -151,339 +169,364 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie @override Widget build(BuildContext context) { super.build(context); - return Stack( - children: [ - CachedNetworkImage( - fit: BoxFit.fitHeight, - imageUrl: characterInfoBean.bgUrl!, - errorWidget: (context, url, error) => const Icon(Icons.error), - ), - Positioned( - bottom: 0, - child: Container( - width: MediaQuery.of(context).size.width, - height: 311.67, - decoration: BoxDecoration( - gradient: LinearGradient( - colors: [Color(0x00000000), Color(0xFF0C0909)], // 三色渐变数组 - begin: Alignment.topCenter, // 渐变开始位置 - end: Alignment.bottomCenter, // 渐变结束位置 + return Scaffold( + backgroundColor: Color(0xFF121213), + body: Stack( + children: [ + CachedNetworkImage( + fit: BoxFit.cover, + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + imageUrl: characterInfoBean.bgUrl!, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + Positioned( + bottom: 0, + child: Container( + width: MediaQuery.of(context).size.width, + height: 311.67, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Color(0x00000000), Color(0xFF0C0909)], // 三色渐变数组 + begin: Alignment.topCenter, // 渐变开始位置 + end: Alignment.bottomCenter, // 渐变结束位置 + ), ), - ), - )), - Container( - child: Column( - children: [ - ///title - Container( - width: double.infinity, - height: 30, - margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top + 9, left: 16, right: 16), - child: Stack( - alignment: Alignment.center, - children: [ - Positioned( - top: 0, - left: 105, - child: Text( - "+1", - style: TextStyle(color: Color(0xFFF14476), fontSize: 10), - )), - Positioned( - left: 0, - child: Container( - width: 101, - height: 30, - decoration: BoxDecoration(color: Color(0x33000000), borderRadius: BorderRadius.all(Radius.circular(14))), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ///AI头像 - GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ChatInfoPage( - data: characterInfoBean, - )), - ); - }, - child: Container( - margin: EdgeInsets.only(left: 2), - child: CachedNetworkImage( - width: 23, - imageUrl: characterInfoBean.icon!, - errorWidget: (context, url, error) => const Icon(Icons.error), + )), + Container( + child: Column( + children: [ + ///title + Container( + width: double.infinity, + height: 30, + margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top + 9, left: 16, right: 16), + child: Stack( + alignment: Alignment.center, + children: [ + Positioned( + top: 0, + left: 105, + child: Text( + "+1", + style: TextStyle(color: Color(0xFFF14476), fontSize: 10), + )), + Positioned( + left: 0, + child: Container( + width: 101, + height: 30, + decoration: BoxDecoration(color: Color(0x33000000), borderRadius: BorderRadius.all(Radius.circular(14))), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ///AI头像 + GestureDetector( + onTap: () { + if (NetworkConfig.userId == "") { + Navigator.of(context).pushNamed('/LoginPage'); + return; + } + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ChatInfoPage( + data: characterInfoBean, + )), + ); + }, + child: Container( + margin: EdgeInsets.only(left: 2), + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(30)), + child: CachedNetworkImage( + width: 23, + height: 23, + imageUrl: characterInfoBean.icon!, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + ), ), ), - ), - ///AI名 - Container( - margin: EdgeInsets.only(left: 5), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - width: 35, - child: Text( - characterInfoBean.characterName!, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 10, color: Colors.white), - ), - ), - Text( - '${characterInfoBean.lookCount} 聊过', - style: TextStyle(fontSize: 7, color: Colors.white), - ), - ], - ), - ), - - ///心动值 - Container( - margin: EdgeInsets.only(left: 6, right: 6), - child: GestureDetector( - onTap: () { - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => ChatPage( - // characterId: characterInfoBean.characterId.toString(), - // )), - // ); - }, - child: Stack( - alignment: Alignment.center, + ///AI名 + Container( + margin: EdgeInsets.only(left: 5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ - Image( - width: 24, - height: 21, - image: AssetImage('assets/images/ic_beckoning.png'), + SizedBox( + width: 35, + child: Text( + characterInfoBean.characterName!, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 10, color: Colors.white), + ), ), Text( - characterInfoBean.intimacy.toString(), - style: TextStyle(fontSize: 8, color: Colors.white), - ) + '${characterInfoBean.lookCount} 聊过', + style: TextStyle(fontSize: 7, color: Colors.white), + ), ], ), ), - ), - ], - ), - ), - ), - ///关注 - Positioned( - right: 0, - child: GestureDetector( - onTap: () { - isHalf = !isHalf; - setState(() {}); - }, - child: Container( - width: 50, - height: 24, - alignment: Alignment.center, - decoration: BoxDecoration(color: Color(0x33000000), borderRadius: BorderRadius.all(Radius.circular(12))), - child: Text( - '+ 关注', - style: TextStyle(fontSize: 12, color: Colors.white), + ///心动值 + Container( + margin: EdgeInsets.only(left: 6, right: 6), + child: GestureDetector( + onTap: () { + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => ChatPage( + // characterId: characterInfoBean.characterId.toString(), + // )), + // ); + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image( + width: 24, + height: 21, + image: AssetImage('assets/images/ic_beckoning.png'), + ), + Text( + characterInfoBean.intimacy.toString(), + style: TextStyle(fontSize: 8, color: Colors.white), + ) + ], + ), + ), + ), + ], ), ), ), - ), - ], - ), - ), - isHalf - ? Container( - height: MediaQuery.of(context).size.height / 3.5, - ) - : Container(), - ///聊天列表 - Expanded( - child: ListView.builder( - controller: _scrollController, - itemCount: chatList.length, - itemBuilder: (BuildContext context, int index) { - return _item(index); - })), - Container( - alignment: Alignment.centerLeft, - margin: EdgeInsets.only(left: 16, bottom: 3), - child: Image(width: 63, height: 18, image: AssetImage('assets/images/ic_memory.png')), - ), - - ///输入 功能 - Container( - width: MediaQuery.of(context).size.width, - margin: EdgeInsets.only(left: 16, right: 16, bottom: !isMore ? 60 : 0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - ///输入框 - Expanded( - child: Container( - padding: const EdgeInsets.symmetric(vertical: 5), - decoration: const BoxDecoration( - color: Color(0x33FFFFFF), - borderRadius: BorderRadius.all(Radius.circular(20)), + ///关注 + Positioned( + right: 0, + child: GestureDetector( + onTap: () { + if (NetworkConfig.userId == "") { + Navigator.of(context).pushNamed('/LoginPage'); + return; + } + isHalf = !isHalf; + setState(() {}); + }, + child: Container( + width: 50, + height: 24, + alignment: Alignment.center, + decoration: BoxDecoration(color: Color(0x33000000), borderRadius: BorderRadius.all(Radius.circular(12))), + child: Text( + '+ 关注', + style: TextStyle(fontSize: 12, color: Colors.white), + ), + ), + ), ), - child: Row( - children: [ - Expanded( - child: Container( - padding: const EdgeInsets.only(left: 15), - child: TextField( - controller: _chatController, - onChanged: _textFieldChanged, - maxLines: null, - cursorColor: const Color(0xFFFF9000), - decoration: const InputDecoration( - border: InputBorder.none, - // 移除非聚焦状态下的边框 - enabledBorder: InputBorder.none, - // 移除获得焦点但未输入内容时的边框 - focusedBorder: InputBorder.none, - isCollapsed: true, - // 移除输入时的边框 - hintText: "打个招呼吧...", - hintStyle: TextStyle(color: Color(0xFFB6B6B6), fontSize: 13), + ], + ), + ), + isHalf + ? Container( + height: MediaQuery.of(context).size.height / 3.5, + ) + : Container(), + + ///聊天列表 + Expanded( + child: ListView.builder( + controller: _scrollController, + itemCount: chatList.length, + itemBuilder: (BuildContext context, int index) { + return _item(index); + })), + Container( + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(left: 16, bottom: 3), + child: Image(width: 63, height: 18, image: AssetImage('assets/images/ic_memory.png')), + ), + + ///输入 功能 + Container( + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.only(left: 16, right: 16, bottom: !isMore ? 60 : 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ///输入框 + Expanded( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 5), + decoration: const BoxDecoration( + color: Color(0x33FFFFFF), + borderRadius: BorderRadius.all(Radius.circular(20)), + ), + child: Row( + children: [ + Expanded( + child: Container( + padding: const EdgeInsets.only(left: 15), + child: TextField( + controller: _chatController, + onChanged: _textFieldChanged, + maxLines: null, + cursorColor: const Color(0xFFFF9000), + decoration: const InputDecoration( + border: InputBorder.none, + // 移除非聚焦状态下的边框 + enabledBorder: InputBorder.none, + // 移除获得焦点但未输入内容时的边框 + focusedBorder: InputBorder.none, + isCollapsed: true, + // 移除输入时的边框 + hintText: "打个招呼吧...", + hintStyle: TextStyle(color: Color(0xFFB6B6B6), fontSize: 13), + ), + style: const TextStyle(color: Colors.white), ), - style: const TextStyle(color: Colors.white), ), ), - ), - ///发送 - Container( - margin: const EdgeInsets.only(right: 7), - child: text == "" - ? const Image( - width: 27, - image: AssetImage('assets/images/ic_send_n.png'), - ) - : GestureDetector( - onTap: () { - EasyLoading.show(status: 'loading...'); - chatList.add(ChatInfoBean(0, "user", text, "timestamp", "claudeType", 0, "userIcon")); - _viewmodel.sendMessage(widget.characterId, text); - _chatController.clear(); - text = ""; - Future.delayed(Duration(milliseconds: 200), () { - _scrollController.jumpTo(_scrollController.position.maxScrollExtent); - }); - setState(() {}); - }, - child: Image( + ///发送 + Container( + margin: const EdgeInsets.only(right: 7), + child: text == "" + ? const Image( width: 27, - image: AssetImage('assets/images/ic_send.png'), + image: AssetImage('assets/images/ic_send_n.png'), + ) + : GestureDetector( + onTap: () { + if (NetworkConfig.userId == "") { + Navigator.of(context).pushNamed('/LoginPage'); + return; + } + EasyLoading.show(status: 'loading...'); + chatList.add(ChatInfoBean(0, "user", text, "timestamp", "claudeType", 0, "userIcon")); + _viewmodel.sendMessage(widget.characterId, text); + _chatController.clear(); + text = ""; + Future.delayed(Duration(milliseconds: 200), () { + _scrollController.jumpTo(_scrollController.position.maxScrollExtent); + }); + setState(() {}); + }, + child: Image( + width: 27, + image: AssetImage('assets/images/ic_send.png'), + ), ), - ), - ) - ], - ), - )), + ) + ], + ), + )), - ///智能输入 - Container( - margin: const EdgeInsets.only(left: 14, right: 14), - child: GestureDetector( + ///智能输入 + Container( + margin: const EdgeInsets.only(left: 14, right: 14), + child: GestureDetector( + onTap: () { + Navigator.of(context).pushNamed('/LoginPage'); + }, + child: Image( + width: 27, + image: AssetImage('assets/images/ic_smart_chat.png'), + ), + ), + ), + + ///功能 更多 + GestureDetector( onTap: () { - Navigator.of(context).pushNamed('/LoginPage'); + if (NetworkConfig.userId == "") { + Navigator.of(context).pushNamed('/LoginPage'); + return; + } + isMore = !isMore; + setState(() {}); }, child: Image( width: 27, - image: AssetImage('assets/images/ic_smart_chat.png'), + image: AssetImage('assets/images/ic_more.png'), ), ), - ), - - ///功能 更多 - GestureDetector( - onTap: () { - isMore = !isMore; - setState(() {}); - }, - child: Image( - width: 27, - image: AssetImage('assets/images/ic_more.png'), - ), - ), - ], + ], + ), ), - ), - isMore - ? Container( - height: 70, - alignment: Alignment.centerLeft, - margin: EdgeInsets.only(left: 16, right: 16, bottom: 60), - 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: GestureDetector( - onTap: () { - EasyLoading.show(status: 'loading...'); - _viewmodel.delChat(widget.characterId); - }, + isMore + ? Container( + height: 70, + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(left: 16, right: 16, bottom: 60), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + margin: EdgeInsets.only(left: 23), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Image(width: 26, height: 26, image: AssetImage('assets/images/ic_restart.png')), + 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(), - ], + Container( + margin: EdgeInsets.only(left: 23), + child: GestureDetector( + onTap: () { + EasyLoading.show(status: 'loading...'); + _viewmodel.delChat(widget.characterId); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image(width: 26, height: 26, image: AssetImage('assets/images/ic_restart.png')), + Container( + margin: EdgeInsets.only(top: 9), + child: Text( + '重启对话', + style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), + ), + ), + ], + ), + ), + ), + ], + ), + ) + : Container(), + ], + ), ), - ), - ///记忆提升中 - Positioned( - top: 65, - left: 16, - child: Image( - width: 47, - height: 12, - image: AssetImage('assets/images/ic_memory_p.png'), - )), - ], + ///记忆提升中 + Positioned( + top: (MediaQuery.of(context).padding.top) * 2 + 10, + left: 16, + child: Image( + width: 47, + height: 12, + image: AssetImage('assets/images/ic_memory_p.png'), + )), + ], + ), ); } diff --git a/lib/tools/home_page.dart b/lib/tools/home_page.dart index 6e827a9..3a91213 100644 --- a/lib/tools/home_page.dart +++ b/lib/tools/home_page.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:talk/network/NetworkConfig.dart'; import 'package:talk/tools/home/my_home_page.dart'; import 'package:talk/tools/me/me_page.dart'; import 'package:talk/tools/message/message_page.dart'; @@ -74,6 +75,11 @@ class _HomePageState extends State with SingleTickerProviderStateMixin ), GestureDetector( onTap: () { + if (NetworkConfig.userId == "") { + Navigator.of(context).pushNamed('/LoginPage'); + return; + } + currentIndex = 1; _tabController.animateTo(1); setState(() {}); @@ -89,6 +95,10 @@ class _HomePageState extends State with SingleTickerProviderStateMixin ), GestureDetector( onTap: () { + if (NetworkConfig.userId == "") { + Navigator.of(context).pushNamed('/LoginPage'); + return; + } currentIndex = 2; _tabController.animateTo(2); setState(() {}); @@ -100,6 +110,10 @@ class _HomePageState extends State with SingleTickerProviderStateMixin ), GestureDetector( onTap: () { + if (NetworkConfig.userId == "") { + Navigator.of(context).pushNamed('/LoginPage'); + return; + } currentIndex = 3; _tabController.animateTo(3); setState(() {}); diff --git a/lib/tools/login/login_page.dart b/lib/tools/login/login_page.dart index 00341d5..c6728ab 100644 --- a/lib/tools/login/login_page.dart +++ b/lib/tools/login/login_page.dart @@ -105,168 +105,169 @@ class _LoginPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - body: Stack( - alignment: Alignment.center, - children: [ - Image(fit: BoxFit.fill, image: AssetImage('assets/images/login_bj.png')), - Positioned( - left: 22, - top: 28, - child: GestureDetector( - onTap: () { - Navigator.pop(context); - }, - child: Image( - height: 23, - image: AssetImage('assets/images/ic_left_arrow.png'), - ), - )), - Positioned( - left: 36, - top: 76, - child: Text( - '妙语', - style: TextStyle(color: Colors.white, fontSize: 33), - )), - Positioned( - left: 36, - top: 115, - child: Text( - '登陆 / 注册', - style: TextStyle(color: Color(0xFFD5D5D5), fontSize: 18), - )), - Positioned( - bottom: 35, - child: Container( - width: MediaQuery.of(context).size.width, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () { - isCheck = !isCheck; - setState(() {}); - }, - child: Image(width: 16, image: isCheck ? AssetImage('assets/images/ic_ck_s.png') : AssetImage('assets/images/ic_ck.png')), - ), - Container( - margin: EdgeInsets.only(left: 10), - child: RichText( - text: TextSpan(children: [ - TextSpan(text: '我已阅读并同意', style: TextStyle(fontSize: 12, color: Color(0xFF5F5F5F))), - TextSpan(text: '用户协议', style: TextStyle(fontSize: 12, color: Color(0xFFFF9000))), - TextSpan(text: '和', style: TextStyle(fontSize: 12, color: Color(0xFF5F5F5F))), - TextSpan(text: '隐私协议', style: TextStyle(fontSize: 12, color: Color(0xFFFF9000))), - ]), + body: SingleChildScrollView( + child: Stack( + alignment: Alignment.center, + children: [ + Image(fit: BoxFit.cover, height: MediaQuery.of(context).size.height, image: AssetImage('assets/images/login_bj.png')), + Positioned( + left: 22, + top: MediaQuery.of(context).padding.top + 9, + child: GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Image( + height: 23, + image: AssetImage('assets/images/ic_left_arrow.png'), + ), + )), + Positioned( + left: 36, + top: 76, + child: Text( + '妙语', + style: TextStyle(color: Colors.white, fontSize: 33), + )), + Positioned( + left: 36, + top: 115, + child: Text( + '登陆 / 注册', + style: TextStyle(color: Color(0xFFD5D5D5), fontSize: 18), + )), + Positioned( + bottom: 35, + child: Container( + width: MediaQuery.of(context).size.width, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () { + isCheck = !isCheck; + setState(() {}); + }, + child: Image(width: 16, image: isCheck ? AssetImage('assets/images/ic_ck_s.png') : AssetImage('assets/images/ic_ck.png')), ), - ) - ], - ), - )), - Positioned( - bottom: 70, - child: GestureDetector( - onTap: () { - if (phoneText != "" && codeText != "") { - if (isCheck) { - EasyLoading.showToast("登录"); - _viewmodel.login(phoneText, codeText, 0, - "eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJOaWNrTmFtZSI6IuaWsOeUqOaItyIsIlVzZXJJZCI6IjMiLCJleHAiOjE3MjEyMjQzNjksImlzcyI6Ikh1YW5NZW5nIiwiYXVkIjoiSHVhbk1lbmdBcHAifQ.gxf2y47qWuNtEf2xvGSG6ATEgaXOrTWbJpi_Bp6eU2k"); - } else { - EasyLoading.showToast("请选中协议"); + Container( + margin: EdgeInsets.only(left: 10), + child: RichText( + text: TextSpan(children: [ + TextSpan(text: '我已阅读并同意', style: TextStyle(fontSize: 12, color: Color(0xFF5F5F5F))), + TextSpan(text: '用户协议', style: TextStyle(fontSize: 12, color: Color(0xFFFF9000))), + TextSpan(text: '和', style: TextStyle(fontSize: 12, color: Color(0xFF5F5F5F))), + TextSpan(text: '隐私协议', style: TextStyle(fontSize: 12, color: Color(0xFFFF9000))), + ]), + ), + ) + ], + ), + )), + Positioned( + bottom: 70, + child: GestureDetector( + onTap: () { + if (phoneText != "" && codeText != "") { + if (isCheck) { + EasyLoading.showToast("登录"); + _viewmodel.login(phoneText, codeText, 1, ""); + } else { + EasyLoading.showToast("请选中协议"); + } } - } - }, + }, + child: Container( + height: 43, + width: 288, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(phoneText != "" && codeText != "" ? 0xFFFF9000 : 0xFFAC6D1C), + borderRadius: BorderRadius.all(Radius.circular(7)), + ), + child: Text( + '登录', + style: TextStyle(fontSize: 15, fontWeight: FontWeight.w600), + ), + ), + )), + Positioned( + bottom: 125, child: Container( height: 43, width: 288, alignment: Alignment.center, decoration: BoxDecoration( - color: Color(phoneText != "" && codeText != "" ? 0xFFFF9000 : 0xFFAC6D1C), + color: Color(0x33FFFFFF), borderRadius: BorderRadius.all(Radius.circular(7)), ), - child: Text( - '登录', - style: TextStyle(fontSize: 15, fontWeight: FontWeight.w600), - ), - ), - )), - Positioned( - bottom: 125, - child: Container( - height: 43, - width: 288, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Color(0x33FFFFFF), - borderRadius: BorderRadius.all(Radius.circular(7)), - ), - child: Row( - children: [ - Expanded( - child: Container( - padding: EdgeInsets.only(left: 17, bottom: 6), - child: TextField( - controller: _codeController, - onChanged: _codeChanged, - cursorColor: Color(0xFFFF9000), - keyboardType: TextInputType.number, - decoration: InputDecoration( - border: InputBorder.none, - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - hintText: "请输入验证码", - hintStyle: TextStyle(color: Color(0xFFB5B5B5), fontSize: 15), + child: Row( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.only(left: 17, bottom: 6), + child: TextField( + controller: _codeController, + onChanged: _codeChanged, + cursorColor: Color(0xFFFF9000), + keyboardType: TextInputType.number, + decoration: InputDecoration( + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + hintText: "请输入验证码", + hintStyle: TextStyle(color: Color(0xFFB5B5B5), fontSize: 15), + ), + style: TextStyle(color: Colors.white), ), - style: TextStyle(color: Colors.white), ), ), - ), - GestureDetector( - onTap: () { - if (!_isCountingDown) { - getCode(); - } - }, - child: Container( - margin: EdgeInsets.only(right: 14), - child: Text( - !_isCountingDown ? "获取验证码" : "$_timeLeft后重新获取", - style: TextStyle(fontSize: 15, color: Color(0xFFB5B5B5)), + GestureDetector( + onTap: () { + if (!_isCountingDown) { + getCode(); + } + }, + child: Container( + margin: EdgeInsets.only(right: 14), + child: Text( + !_isCountingDown ? "获取验证码" : "$_timeLeft后重新获取", + style: TextStyle(fontSize: 15, color: Color(0xFFB5B5B5)), + ), ), ), - ), - ], - ), - )), - Positioned( - bottom: 178, - child: Container( - height: 43, - width: 288, - alignment: Alignment.center, - padding: EdgeInsets.only(left: 17, bottom: 6), - decoration: BoxDecoration( - color: Color(0x33FFFFFF), - borderRadius: BorderRadius.all(Radius.circular(7)), - ), - child: TextField( - controller: _phoneController, - onChanged: _phoneChanged, - cursorColor: Color(0xFFFF9000), - keyboardType: TextInputType.number, - decoration: InputDecoration( - border: InputBorder.none, - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - hintText: "请输入手机号", - hintStyle: TextStyle(color: Color(0xFFB5B5B5), fontSize: 15), + ], ), - style: TextStyle(color: Colors.white), - ), - )), - ], + )), + Positioned( + bottom: 178, + child: Container( + height: 43, + width: 288, + alignment: Alignment.center, + padding: EdgeInsets.only(left: 17, bottom: 6), + decoration: BoxDecoration( + color: Color(0x33FFFFFF), + borderRadius: BorderRadius.all(Radius.circular(7)), + ), + child: TextField( + controller: _phoneController, + onChanged: _phoneChanged, + cursorColor: Color(0xFFFF9000), + keyboardType: TextInputType.number, + decoration: InputDecoration( + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + hintText: "请输入手机号", + hintStyle: TextStyle(color: Color(0xFFB5B5B5), fontSize: 15), + ), + style: TextStyle(color: Colors.white), + ), + )), + ], + ), ), ); } diff --git a/lib/tools/start_page.dart b/lib/tools/start_page.dart index 4255d77..d3c00b0 100644 --- a/lib/tools/start_page.dart +++ b/lib/tools/start_page.dart @@ -61,9 +61,10 @@ class _StartPageState extends State { @override Widget build(BuildContext context) { return Container( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, child: Image( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + fit: BoxFit.cover, image: AssetImage('assets/images/img_start.png'), ), ); diff --git a/pubspec.yaml b/pubspec.yaml index 56e5791..001a31f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,6 +46,7 @@ dependencies: expandable_text: ^2.3.0 card_swiper: ^3.0.1 flutter_slidable: ^3.1.0 + flutter_keyboard_visibility: ^6.0.0 dev_dependencies: flutter_test: