This commit is contained in:
CYH 2023-07-06 16:52:31 +08:00
parent 26a9982e9b
commit 9255edfe38
11 changed files with 150 additions and 47 deletions

View File

@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>应用想要访问您的位置,用于设置个人资料</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>应用想要访问您的位置,用于设置个人资料</string>
<key>NSMicrophoneUsageDescription</key> <key>NSMicrophoneUsageDescription</key>
<string>应用想要访问您的麦克风,用于发送语音</string> <string>应用想要访问您的麦克风,用于发送语音</string>
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>

View File

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:math'; import 'dart:math';
import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart';
import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart'; import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
@ -175,7 +176,7 @@ class TIMToolTipsConfig {
this.additionalItemBuilder}); this.additionalItemBuilder});
} }
class TIMUIKitHistoryMessageListItem extends StatefulWidget { class TIMHistoryMessageListItem extends StatefulWidget {
/// message instance /// message instance
final V2TimMessage message; final V2TimMessage message;
@ -261,7 +262,7 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget {
final List customEmojiStickerList; final List customEmojiStickerList;
const TIMUIKitHistoryMessageListItem( const TIMHistoryMessageListItem(
{Key? key, {Key? key,
required this.message, required this.message,
@Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
@ -332,7 +333,7 @@ class TipsActionItem extends TIMUIKitStatelessWidget {
} }
class _TIMUIKItHistoryMessageListItemState class _TIMUIKItHistoryMessageListItemState
extends TIMUIKitState<TIMUIKitHistoryMessageListItem> extends TIMUIKitState<TIMHistoryMessageListItem>
with TickerProviderStateMixin { with TickerProviderStateMixin {
SuperTooltip? tooltip; SuperTooltip? tooltip;
@ -459,7 +460,7 @@ class _TIMUIKItHistoryMessageListItemState
clearJump, clearJump,
)!; )!;
} }
return TIMUIKitTextElem( return TIMTextElem(
chatModel: model, chatModel: model,
message: messageItem, message: messageItem,
isFromSelf: messageItem.isSelf ?? true, isFromSelf: messageItem.isSelf ?? true,

View File

@ -17,6 +17,8 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageLi
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'tim_uikit_chat_history_message_list_item.dart';
enum LoadingPlace { enum LoadingPlace {
none, none,
top, top,
@ -154,7 +156,7 @@ class _TIMUIKitHistoryMessageListContainerState
groupAtInfoList: widget.groupAtInfoList, groupAtInfoList: widget.groupAtInfoList,
mainHistoryListConfig: widget.mainHistoryListConfig, mainHistoryListConfig: widget.mainHistoryListConfig,
itemBuilder: (context, message) { itemBuilder: (context, message) {
return TIMUIKitHistoryMessageListItem( return TIMHistoryMessageListItem(
textFieldController: widget.textFieldController, textFieldController: widget.textFieldController,
userAvatarBuilder: widget.userAvatarBuilder, userAvatarBuilder: widget.userAvatarBuilder,
customEmojiStickerList: widget.customEmojiStickerList, customEmojiStickerList: widget.customEmojiStickerList,

View File

@ -13,7 +13,7 @@ import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/link_preview_en
import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/widgets/link_preview.dart'; import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/widgets/link_preview.dart';
import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart';
class TIMUIKitTextElem extends StatefulWidget { class TIMTextElem extends StatefulWidget {
final V2TimMessage message; final V2TimMessage message;
final bool isFromSelf; final bool isFromSelf;
final bool isShowJump; final bool isShowJump;
@ -27,7 +27,7 @@ class TIMUIKitTextElem extends StatefulWidget {
final bool isUseDefaultEmoji; final bool isUseDefaultEmoji;
final List customEmojiStickerList; final List customEmojiStickerList;
const TIMUIKitTextElem( const TIMTextElem(
{Key? key, {Key? key,
required this.message, required this.message,
required this.isFromSelf, required this.isFromSelf,
@ -44,10 +44,10 @@ class TIMUIKitTextElem extends StatefulWidget {
: super(key: key); : super(key: key);
@override @override
State<StatefulWidget> createState() => _TIMUIKitTextElemState(); State<StatefulWidget> createState() => _TIMTextElemState();
} }
class _TIMUIKitTextElemState extends TIMUIKitState<TIMUIKitTextElem> { class _TIMTextElemState extends TIMUIKitState<TIMTextElem> {
bool isShowJumpState = false; bool isShowJumpState = false;
bool isShining = false; bool isShining = false;
@ -59,7 +59,7 @@ class _TIMUIKitTextElemState extends TIMUIKitState<TIMUIKitTextElem> {
} }
@override @override
void didUpdateWidget(TIMUIKitTextElem oldWidget) { void didUpdateWidget(TIMTextElem oldWidget) {
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
if (oldWidget.message.msgID == null && widget.message.msgID != null) { if (oldWidget.message.msgID == null && widget.message.msgID != null) {
_getLinkPreview(); _getLinkPreview();

View File

@ -1,5 +1,7 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:circle_app/app/chat/TIMUIKitChat/tim_uikit_chat.dart'; import 'package:circle_app/app/chat/TIMUIKitChat/tim_uikit_chat.dart';
import 'package:circle_app/components/my_app_bar.dart'; import 'package:circle_app/components/my_app_bar.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -60,12 +62,7 @@ class ChatPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return TIMChat( return TIMChat(
conversation: logic.selectedConversation ?? conversation: logic.selectedConversation!,
V2TimConversation(
conversationID: "c2c_10040818",
userID: "10040818",
showName: "Test Chat",
type: 1),
customStickerPanel: renderCustomStickerPanel, customStickerPanel: renderCustomStickerPanel,
config: const TIMUIKitChatConfig( config: const TIMUIKitChatConfig(
// 使 // 使
@ -83,12 +80,36 @@ class ChatPage extends StatelessWidget {
], ],
), ),
customAppBar: MyAppBar( customAppBar: MyAppBar(
centerTitle: '1111', centerTitle: logic.selectedConversation!.showName!,
actionWdiget: GestureDetector( actionWdiget: GestureDetector(
child: Text('TA的主页',style: TextStyle(color: Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),), child: Text('TA的主页',style: TextStyle(color: Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),),
), ),
onPressed: () {}, onPressed: () {},
), ),
userAvatarBuilder: (BuildContext context, V2TimMessage message) {
return avatarWidget(message.faceUrl ?? 'http://qiniuyun.ikuayou.com/avatar/default/default_header.png');
},
); );
} }
avatarWidget(String url, {double width = 34}) {
return GestureDetector(
child: Stack(
alignment: Alignment.center,
children: [
Image.asset(
getCircleImage('avatar_bg'),
width: width.sp,
),
url.contains("http") ? ClipOval(
child: CachedNetworkImage(
imageUrl:url,
width: (width - 2).sp,
height: (width - 2).sp,
fit: BoxFit.cover,
),
) : Text(url,style: TextStyle(color: Color(0xffF756FF),fontSize: 12.sp),)
],
));
}
} }

View File

@ -1,5 +1,8 @@
import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/app/circle/logic.dart';
import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/app/minefragment/logic.dart';
import 'package:circle_app/main.dart';
import 'package:circle_app/network/api.dart';
import 'package:circle_app/network/dio_manager.dart';
import 'package:circle_app/util/util.dart'; import 'package:circle_app/util/util.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -24,12 +27,26 @@ class HomeLogic extends GetxController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
getIMData();
tabs.add(MsgPage()); tabs.add(MsgPage());
tabs.add(CirclePage()); tabs.add(CirclePage());
tabs.add(MinefragmentPage()); tabs.add(MinefragmentPage());
} }
void getIMData() async {
// _coreInstance.;
if (!coreInstance.isLoginSuccess) {
var data = await DioManager.instance
.get(url: Api.getIMInfo);
if (data['code'] == 200) {
loginIM(data['data']['account_id'].toString(), data['data']['user_sig']);
}
}
}
String getInfo () { String getInfo () {
return getBaseImage('image'); return getBaseImage('image');

View File

@ -1,3 +1,4 @@
import 'package:circle_app/app/circle/logic.dart';
import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/router/app_routers.dart';
import 'package:circle_app/util/util.dart'; import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -30,9 +31,9 @@ class MsgPage extends StatelessWidget {
return Column( return Column(
children: [ children: [
navigatorItem(), navigatorItem(),
tipWidget(), // tipWidget(),
reconmandWidget(), // reconmandWidget(),
Text(controller.state.msg), // Text(controller.state.msg),
Expanded(child: msgWdiget(context)) Expanded(child: msgWdiget(context))
], ],
); );
@ -42,6 +43,11 @@ class MsgPage extends StatelessWidget {
} }
navigatorItem() { navigatorItem() {
var logic = Get.find<CircleLogic>();
String count = '0';
if (logic != null) {
count = (logic.statistics?['like_me_count'] ?? 0).toString();
}
return Container( return Container(
width: Get.width, width: Get.width,
padding: EdgeInsets.only(left: 18.sp, right: 18.sp), padding: EdgeInsets.only(left: 18.sp, right: 18.sp),
@ -52,11 +58,39 @@ class MsgPage extends StatelessWidget {
Positioned( Positioned(
left: 0, left: 0,
child: GestureDetector( child: GestureDetector(
child: Image.asset( onTap: () {
getMsgImage('msg_love'), Get.toNamed(AppRoutes.FriendsActivity,arguments: '1');
width: 30.sp, },
), child: Stack(
)), children: [
Container(width: count .length > 2 ? 45.sp : count .length > 1 ? 38.sp : 35.sp,height: 30.sp,),
Image.asset(
getMsgImage('msg_love'),
width: 30.sp,
),
int.parse(count) > 0 ? Positioned(
right:0,
child: Container(
padding: EdgeInsets.only(left: 5.sp,right: 5.sp),
height: 14.sp,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7.sp),
gradient:const LinearGradient(colors: [
Color(0xFFC343F9),
Color(0xFFFB34B2),
],
)
),
alignment: Alignment.center,
child: Text(
int.parse(count) > 99 ? '99+' : count,
style: TextStyle(color: Colors.white,fontSize: 10.sp,fontWeight: FontWeight.w500),
),
)) : Container(),
],
))),
ShaderMask( ShaderMask(
shaderCallback: (Rect bounds) { shaderCallback: (Rect bounds) {
return const LinearGradient( return const LinearGradient(

View File

@ -17,6 +17,7 @@ class UserinfoLogic extends GetxController {
final UserinfoState state = UserinfoState(); final UserinfoState state = UserinfoState();
final ImagePicker _picker = ImagePicker(); final ImagePicker _picker = ImagePicker();
UserBean? userInfoBean = null; UserBean? userInfoBean = null;
String imId = '';
String ageMsg = ""; String ageMsg = "";
var isVip = 0; var isVip = 0;
var onLineCity = ""; var onLineCity = "";
@ -45,15 +46,14 @@ class UserinfoLogic extends GetxController {
} }
state.imaglist.clear(); state.imaglist.clear();
if (userId == '') { if (userId == '') {
isMe = true; isMe = true;
var data = await DioManager.instance.get(url: Api.getUserInfo); var data = await DioManager.instance.get(url: Api.getUserInfo);
var bean = BaseResponse<ResponseBean>.fromJson( var bean = BaseResponse<ResponseBean>.fromJson(
data, (data) => ResponseBean.fromJson(data)); data, (data) => ResponseBean.fromJson(data));
if (bean.isSuccess()) { if (bean.isSuccess()) {
isLikeFoMsg = isLikeFoMsg =
"${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新"; "${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新";
userInfoBean = bean.data.user; userInfoBean = bean.data.user;
isVip = userInfoBean!.vip; isVip = userInfoBean!.vip;
//访线 //访线
@ -79,8 +79,6 @@ class UserinfoLogic extends GetxController {
state.imaglist.add(element); state.imaglist.add(element);
}); });
} }
} else { } else {
isMe = false; isMe = false;
var data = await DioManager.instance var data = await DioManager.instance
@ -93,7 +91,7 @@ class UserinfoLogic extends GetxController {
"${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新"; "${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新";
userInfoBean = bean.data!.user; userInfoBean = bean.data!.user;
isVip = userInfoBean!.vip; isVip = userInfoBean!.vip;
imId = bean.data.account_id;
onLineCity = userInfoBean!.isOnline == true ? "在线" : "离线"; onLineCity = userInfoBean!.isOnline == true ? "在线" : "离线";
if (userInfoBean!.city != null) { if (userInfoBean!.city != null) {
onLineCity = "$onLineCity·${userInfoBean!.city}"; onLineCity = "$onLineCity·${userInfoBean!.city}";
@ -126,8 +124,6 @@ class UserinfoLogic extends GetxController {
} }
update(); update();
var data = var data =
await DioManager.instance.get(url: Api.getqiniuToken, params: {}); await DioManager.instance.get(url: Api.getqiniuToken, params: {});
var bean = BaseResponse<QnTokenData>.fromJson( var bean = BaseResponse<QnTokenData>.fromJson(
@ -154,7 +150,7 @@ class UserinfoLogic extends GetxController {
var bean = BaseResponse<String>.fromJson(data, (data) => data); var bean = BaseResponse<String>.fromJson(data, (data) => data);
if (bean.code == 200) { if (bean.code == 200) {
state.imaglist.removeAt(index); state.imaglist.removeAt(index);
// Navigator.pop(Get.context!); // Navigator.pop(Get.context!);
update(); update();
} }
} }
@ -305,15 +301,18 @@ class ResponseBean {
int likeMeCount; int likeMeCount;
int imageUrgeCount; int imageUrgeCount;
bool is_follow; bool is_follow;
String account_id;
ResponseBean( ResponseBean(
{required this.user, {required this.user,
required this.likeMeCount, required this.likeMeCount,
required this.imageUrgeCount, required this.imageUrgeCount,
required this.account_id,
required this.is_follow}); required this.is_follow});
factory ResponseBean.fromJson(Map<String, dynamic> json) { factory ResponseBean.fromJson(Map<String, dynamic> json) {
return ResponseBean( return ResponseBean(
account_id: json['account_id'],
user: UserBean.fromJson(json['user']), user: UserBean.fromJson(json['user']),
likeMeCount: json['like_me_count'], likeMeCount: json['like_me_count'],
imageUrgeCount: json['image_urge_count'], imageUrgeCount: json['image_urge_count'],

View File

@ -1,6 +1,7 @@
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:circle_app/app/userinfo/widgets/home_call_out.dart'; import 'package:circle_app/app/userinfo/widgets/home_call_out.dart';
import 'package:circle_app/main.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -137,7 +138,10 @@ class _MyTabbedScreenState extends State<UserinfoPage>
), ),
GestureDetector( GestureDetector(
onTap: () { onTap: () {
showToast("私聊"); if (logic.userInfoBean != null) {
pushChatPage(logic.imId, logic.userInfoBean!.nickname);
}
}, },
child: Container( child: Container(
width: 130.sp, width: 130.sp,

View File

@ -13,10 +13,35 @@ import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'app/splash/view.dart'; import 'app/splash/view.dart';
final CoreServicesImpl coreInstance = TIMUIKitCore.getInstance();
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
} }
//IM
loginIM(String userId,String sig) async {
var info = await coreInstance.login(
userID: userId,
userSig:sig,);
}
//退IM
logoutIM() async {
await coreInstance.logout();
}
//
pushChatPage(String imId,String userName) {
var con = V2TimConversation(
conversationID: "c2c_$imId",
userID: imId,
showName: userName,
type: 1);
Get.toNamed(AppRoutes.Chat,arguments: con);
}
class MyApp extends StatefulWidget { class MyApp extends StatefulWidget {
const MyApp({super.key}); const MyApp({super.key});
@ -24,12 +49,14 @@ class MyApp extends StatefulWidget {
State<MyApp> createState() => _MyAppState(); State<MyApp> createState() => _MyAppState();
} }
class _MyAppState extends State<MyApp> { class _MyAppState extends State<MyApp> {
// This widget is the root of your application. // This widget is the root of your application.
final List<String> _guideList = ['bg', 'home_back']; final List<String> _guideList = ['bg', 'home_back'];
final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance();
@override @override
void initState() { void initState() {
initIM(); initIM();
@ -38,9 +65,9 @@ class _MyAppState extends State<MyApp> {
} }
initIM() { initIM() {
_coreInstance.init( coreInstance.init(
sdkAppID: sdkAppID:
1400793496, // Replace 0 with the SDKAppID of your IM application when integrating 1400799631, // Replace 0 with the SDKAppID of your IM application when integrating
// language: LanguageEnum.en, // // language: LanguageEnum.en, //
loglevel: LogLevelEnum.V2TIM_LOG_DEBUG, loglevel: LogLevelEnum.V2TIM_LOG_DEBUG,
onTUIKitCallbackListener: (TIMCallback callbackValue) { onTUIKitCallbackListener: (TIMCallback callbackValue) {
@ -73,7 +100,8 @@ class _MyAppState extends State<MyApp> {
} }
}, // [](https://cloud.tencent.com/document/product/269/70746#callback) }, // [](https://cloud.tencent.com/document/product/269/70746#callback)
listener: V2TimSDKListener(onConnectSuccess: () { listener: V2TimSDKListener(onConnectSuccess: () {
loginIM(); print('IM登录成功');
// loginIM();
})); }));
} }
@ -86,13 +114,6 @@ class _MyAppState extends State<MyApp> {
return AssetImage(getBaseImage(image)); return AssetImage(getBaseImage(image));
} }
loginIM() async {
var info = await _coreInstance.login(
userID: '123456',
userSig:
'eJwtzEELgjAYxvHvsmshc25rCl40OlRIYaVX0RUvrTFsDFn03TP1*Pwe*H-Q5VgGTvYoQSTAaD1t6KS2cIeJQxJRxpfn3T0bY6BDSUgx3sQRjfn8yMFAL0dnjBGM8awWXn-jggtBY0qXCjzGcJ7tT4eVrHa6aG9FWfsms*rqK3cW2hulHKkHtzU2L9sUfX-YTTG5');
print(info);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -165,8 +165,8 @@ class Api {
//IM配置信息
static const getIMInfo = 'msg-service/im/token';
// //
static const getInterestsCount = 'user-service/my/statistics'; static const getInterestsCount = 'user-service/my/statistics';