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">
<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>应用想要访问您的位置,用于设置个人资料</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>应用想要访问您的位置,用于设置个人资料</string>
<key>NSMicrophoneUsageDescription</key>
<string>应用想要访问您的麦克风,用于发送语音</string>
<key>NSCameraUsageDescription</key>

View File

@ -1,6 +1,7 @@
import 'dart:convert';
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:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
@ -175,7 +176,7 @@ class TIMToolTipsConfig {
this.additionalItemBuilder});
}
class TIMUIKitHistoryMessageListItem extends StatefulWidget {
class TIMHistoryMessageListItem extends StatefulWidget {
/// message instance
final V2TimMessage message;
@ -261,7 +262,7 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget {
final List customEmojiStickerList;
const TIMUIKitHistoryMessageListItem(
const TIMHistoryMessageListItem(
{Key? key,
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")
@ -332,7 +333,7 @@ class TipsActionItem extends TIMUIKitStatelessWidget {
}
class _TIMUIKItHistoryMessageListItemState
extends TIMUIKitState<TIMUIKitHistoryMessageListItem>
extends TIMUIKitState<TIMHistoryMessageListItem>
with TickerProviderStateMixin {
SuperTooltip? tooltip;
@ -459,7 +460,7 @@ class _TIMUIKItHistoryMessageListItemState
clearJump,
)!;
}
return TIMUIKitTextElem(
return TIMTextElem(
chatModel: model,
message: messageItem,
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/base_widgets/tim_ui_kit_base.dart';
import 'tim_uikit_chat_history_message_list_item.dart';
enum LoadingPlace {
none,
top,
@ -154,7 +156,7 @@ class _TIMUIKitHistoryMessageListContainerState
groupAtInfoList: widget.groupAtInfoList,
mainHistoryListConfig: widget.mainHistoryListConfig,
itemBuilder: (context, message) {
return TIMUIKitHistoryMessageListItem(
return TIMHistoryMessageListItem(
textFieldController: widget.textFieldController,
userAvatarBuilder: widget.userAvatarBuilder,
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 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart';
class TIMUIKitTextElem extends StatefulWidget {
class TIMTextElem extends StatefulWidget {
final V2TimMessage message;
final bool isFromSelf;
final bool isShowJump;
@ -27,7 +27,7 @@ class TIMUIKitTextElem extends StatefulWidget {
final bool isUseDefaultEmoji;
final List customEmojiStickerList;
const TIMUIKitTextElem(
const TIMTextElem(
{Key? key,
required this.message,
required this.isFromSelf,
@ -44,10 +44,10 @@ class TIMUIKitTextElem extends StatefulWidget {
: super(key: key);
@override
State<StatefulWidget> createState() => _TIMUIKitTextElemState();
State<StatefulWidget> createState() => _TIMTextElemState();
}
class _TIMUIKitTextElemState extends TIMUIKitState<TIMUIKitTextElem> {
class _TIMTextElemState extends TIMUIKitState<TIMTextElem> {
bool isShowJumpState = false;
bool isShining = false;
@ -59,7 +59,7 @@ class _TIMUIKitTextElemState extends TIMUIKitState<TIMUIKitTextElem> {
}
@override
void didUpdateWidget(TIMUIKitTextElem oldWidget) {
void didUpdateWidget(TIMTextElem oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.message.msgID == null && widget.message.msgID != null) {
_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/components/my_app_bar.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
@ -60,12 +62,7 @@ class ChatPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TIMChat(
conversation: logic.selectedConversation ??
V2TimConversation(
conversationID: "c2c_10040818",
userID: "10040818",
showName: "Test Chat",
type: 1),
conversation: logic.selectedConversation!,
customStickerPanel: renderCustomStickerPanel,
config: const TIMUIKitChatConfig(
// 使
@ -83,12 +80,36 @@ class ChatPage extends StatelessWidget {
],
),
customAppBar: MyAppBar(
centerTitle: '1111',
centerTitle: logic.selectedConversation!.showName!,
actionWdiget: GestureDetector(
child: Text('TA的主页',style: TextStyle(color: Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),),
),
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/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:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@ -24,12 +27,26 @@ class HomeLogic extends GetxController {
@override
void onInit() {
super.onInit();
getIMData();
tabs.add(MsgPage());
tabs.add(CirclePage());
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 () {
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/util/util.dart';
import 'package:flutter/material.dart';
@ -30,9 +31,9 @@ class MsgPage extends StatelessWidget {
return Column(
children: [
navigatorItem(),
tipWidget(),
reconmandWidget(),
Text(controller.state.msg),
// tipWidget(),
// reconmandWidget(),
// Text(controller.state.msg),
Expanded(child: msgWdiget(context))
],
);
@ -42,6 +43,11 @@ class MsgPage extends StatelessWidget {
}
navigatorItem() {
var logic = Get.find<CircleLogic>();
String count = '0';
if (logic != null) {
count = (logic.statistics?['like_me_count'] ?? 0).toString();
}
return Container(
width: Get.width,
padding: EdgeInsets.only(left: 18.sp, right: 18.sp),
@ -52,11 +58,39 @@ class MsgPage extends StatelessWidget {
Positioned(
left: 0,
child: GestureDetector(
child: Image.asset(
getMsgImage('msg_love'),
width: 30.sp,
),
)),
onTap: () {
Get.toNamed(AppRoutes.FriendsActivity,arguments: '1');
},
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(
shaderCallback: (Rect bounds) {
return const LinearGradient(

View File

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

View File

@ -1,6 +1,7 @@
import 'package:cached_network_image/cached_network_image.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_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
@ -137,7 +138,10 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
GestureDetector(
onTap: () {
showToast("私聊");
if (logic.userInfoBean != null) {
pushChatPage(logic.imId, logic.userInfoBean!.nickname);
}
},
child: Container(
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';
final CoreServicesImpl coreInstance = TIMUIKitCore.getInstance();
void main() {
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 {
const MyApp({super.key});
@ -24,12 +49,14 @@ class MyApp extends StatefulWidget {
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// This widget is the root of your application.
final List<String> _guideList = ['bg', 'home_back'];
final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance();
@override
void initState() {
initIM();
@ -38,9 +65,9 @@ class _MyAppState extends State<MyApp> {
}
initIM() {
_coreInstance.init(
coreInstance.init(
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, //
loglevel: LogLevelEnum.V2TIM_LOG_DEBUG,
onTUIKitCallbackListener: (TIMCallback callbackValue) {
@ -73,7 +100,8 @@ class _MyAppState extends State<MyApp> {
}
}, // [](https://cloud.tencent.com/document/product/269/70746#callback)
listener: V2TimSDKListener(onConnectSuccess: () {
loginIM();
print('IM登录成功');
// loginIM();
}));
}
@ -86,13 +114,6 @@ class _MyAppState extends State<MyApp> {
return AssetImage(getBaseImage(image));
}
loginIM() async {
var info = await _coreInstance.login(
userID: '123456',
userSig:
'eJwtzEELgjAYxvHvsmshc25rCl40OlRIYaVX0RUvrTFsDFn03TP1*Pwe*H-Q5VgGTvYoQSTAaD1t6KS2cIeJQxJRxpfn3T0bY6BDSUgx3sQRjfn8yMFAL0dnjBGM8awWXn-jggtBY0qXCjzGcJ7tT4eVrHa6aG9FWfsms*rqK3cW2hulHKkHtzU2L9sUfX-YTTG5');
print(info);
}
@override
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';