1.6日2-8条、9条BUG解决,刷新token
This commit is contained in:
parent
54594ade8c
commit
1938e02207
|
|
@ -103,4 +103,10 @@ abstract class RetrofitClient {
|
|||
@Query("enableCamera") bool enableCamera,
|
||||
@Query("uid") String uid,
|
||||
);
|
||||
|
||||
/// 刷新登录Token
|
||||
@POST("/auth/refresh")
|
||||
Future<BaseStructureResult<UserInfoEntity>> refreshToken(
|
||||
@Query("refreshToken") String refreshToken,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,8 +11,13 @@ import 'package:wgshare/utils/toast_utils.dart';
|
|||
import 'package:wgshare/routes/app_routes.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
|
||||
import '../mixins/request_tool_mixin.dart';
|
||||
import '../models/common/base_structure_result.dart';
|
||||
import '../models/user_info_entity.dart';
|
||||
|
||||
class RequestTool {
|
||||
static late Dio _dio;
|
||||
|
||||
// 初始化请求配置
|
||||
static _init() {
|
||||
// 自定义 HttpClient
|
||||
|
|
@ -20,16 +25,21 @@ class RequestTool {
|
|||
|
||||
BaseOptions options = BaseOptions(
|
||||
baseUrl: RequestConfig().baseUrl,
|
||||
connectTimeout: const Duration(milliseconds: RequestConfig.connectTimeout),
|
||||
receiveTimeout: const Duration(milliseconds: RequestConfig.receiveTimeout),
|
||||
connectTimeout:
|
||||
const Duration(milliseconds: RequestConfig.connectTimeout),
|
||||
receiveTimeout:
|
||||
const Duration(milliseconds: RequestConfig.receiveTimeout),
|
||||
);
|
||||
_dio = Dio(options)..httpClientAdapter = IOHttpClientAdapter(createHttpClient: () => httpClient);
|
||||
_dio = Dio(options)
|
||||
..httpClientAdapter =
|
||||
IOHttpClientAdapter(createHttpClient: () => httpClient);
|
||||
_dio.interceptors.add(AuthInterceptor()); // 添加 token
|
||||
_dio.interceptors.add(ResponseHandle()); // 添加 数据返回拦截
|
||||
_dio.interceptors.add(TheError()); // 添加 数据返回拦截
|
||||
const isProd = bool.fromEnvironment('dart.vm.product');
|
||||
if (!isProd && RequestConfig.requestDataPrinting) {
|
||||
_dio.interceptors.add(LogInterceptor(responseBody: true, requestBody: true)); //添加日志
|
||||
_dio.interceptors
|
||||
.add(LogInterceptor(responseBody: true, requestBody: true)); //添加日志
|
||||
}
|
||||
|
||||
return RetrofitClient(_dio, baseUrl: RequestConfig().baseUrl);
|
||||
|
|
@ -108,8 +118,10 @@ class ResponseHandle extends Interceptor {
|
|||
var data = response.data;
|
||||
|
||||
var flag = data != null &&
|
||||
((data['code'] != null && (data['code'] == 401 || data['code'] == '401')) ||
|
||||
(data['Code'] != null && (data['Code'] == 401 || data['Code'] == '401')));
|
||||
((data['code'] != null &&
|
||||
(data['code'] == 401 || data['code'] == '401')) ||
|
||||
(data['Code'] != null &&
|
||||
(data['Code'] == 401 || data['Code'] == '401')));
|
||||
|
||||
if (statusCode == 401 || flag) {
|
||||
Future.delayed(const Duration(seconds: 2), () {
|
||||
|
|
@ -118,7 +130,7 @@ class ResponseHandle extends Interceptor {
|
|||
});
|
||||
}
|
||||
|
||||
if(data['code'] != 200){
|
||||
if (data['code'] != 200) {
|
||||
ToastUtils.showError(data['message']);
|
||||
}
|
||||
|
||||
|
|
@ -126,12 +138,14 @@ class ResponseHandle extends Interceptor {
|
|||
}
|
||||
}
|
||||
|
||||
class TheError extends Interceptor {
|
||||
class TheError extends Interceptor with RequestToolMixin {
|
||||
// late getx.Rx<UserInfoDetail?> userInfo = UserStore.to.userDetailInfo;
|
||||
|
||||
@override
|
||||
void onError(DioException err, ErrorInterceptorHandler handler) {
|
||||
Future<void> onError(
|
||||
DioException err, ErrorInterceptorHandler handler) async {
|
||||
var message = '请求错误,请重试';
|
||||
int? statusCode;
|
||||
|
||||
switch (err.type) {
|
||||
case DioExceptionType.connectionTimeout:
|
||||
|
|
@ -152,7 +166,7 @@ class TheError extends Interceptor {
|
|||
} else {
|
||||
Response? response = err.response;
|
||||
if (response != null) {
|
||||
int? statusCode = response.statusCode;
|
||||
statusCode = response.statusCode;
|
||||
|
||||
var errorMap = response.data;
|
||||
// var runtimeType = errorMap.runtimeType;
|
||||
|
|
@ -163,12 +177,11 @@ class TheError extends Interceptor {
|
|||
switch (statusCode) {
|
||||
case 401:
|
||||
message = '用户登录失效,请重新登录';
|
||||
|
||||
Future.delayed(const Duration(seconds: 2), () {
|
||||
/*Future.delayed(const Duration(seconds: 2), () {
|
||||
// UserStore.to.erase();
|
||||
StorageService.to.erase();
|
||||
getx.Get.offAllNamed(Routes.loginPage);
|
||||
});
|
||||
});*/
|
||||
break;
|
||||
case 404:
|
||||
message = '无效地址';
|
||||
|
|
@ -190,11 +203,17 @@ class TheError extends Interceptor {
|
|||
default:
|
||||
message = '请求错误';
|
||||
}
|
||||
/* if (message == '用户登录失效,请重新登录' && userInfo.value?.id == null) {
|
||||
return handler.next(error);
|
||||
}*/
|
||||
|
||||
if (statusCode == 401) {
|
||||
BaseStructureResult<UserInfoEntity> res = await getClient()
|
||||
.refreshToken(UserStore.to.userInfoEntity.value!.refreshToken);
|
||||
if (null != res.data) {
|
||||
UserStore.to.setToken(res.data!.token);
|
||||
UserStore.to.setRefreshToken(res.data!.refreshToken);
|
||||
UserStore.to.setUserDetailInfo(res.data!);
|
||||
}
|
||||
} else {
|
||||
ToastUtils.showError(message);
|
||||
}
|
||||
return handler.next(err);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
enum AppStorageKey {
|
||||
token(value: 'TOKEN', label: "登录用户的token"),
|
||||
refreshToken(value: 'REFRESHTOKEN', label: "刷新用的token"),
|
||||
userInfo(value: 'USERINFO', label: "登录用户的基本信息"),
|
||||
account(value: 'ACCOUNT', label: "用户名"),
|
||||
pwd(value: 'PWD', label: "密码"),
|
||||
|
|
|
|||
|
|
@ -14,6 +14,9 @@ class UserStore extends GetxController with RequestToolMixin {
|
|||
/// 是否登录
|
||||
String? token;
|
||||
|
||||
/// 刷新用的token
|
||||
String? refreshToken;
|
||||
|
||||
/// 登录类型
|
||||
String? loginType;
|
||||
|
||||
|
|
@ -23,6 +26,7 @@ class UserStore extends GetxController with RequestToolMixin {
|
|||
UserStore init() {
|
||||
loginType = StorageService.to.read(AppStorageKey.loginType.value);
|
||||
token = StorageService.to.read(AppStorageKey.token.value);
|
||||
refreshToken = StorageService.to.read(AppStorageKey.refreshToken.value);
|
||||
try {
|
||||
var userDetail = StorageService.to.read(AppStorageKey.userInfo.value);
|
||||
if (userDetail != null) {
|
||||
|
|
@ -45,6 +49,12 @@ class UserStore extends GetxController with RequestToolMixin {
|
|||
StorageService.to.write(AppStorageKey.token.value, token);
|
||||
}
|
||||
|
||||
/// 保存refreshToken
|
||||
void setRefreshToken(String refreshToken) {
|
||||
this.refreshToken = refreshToken;
|
||||
StorageService.to.write(AppStorageKey.refreshToken.value, refreshToken);
|
||||
}
|
||||
|
||||
/// 保存登录类型
|
||||
void setLoginType(String loginType) {
|
||||
this.loginType = loginType;
|
||||
|
|
@ -61,10 +71,12 @@ class UserStore extends GetxController with RequestToolMixin {
|
|||
void erase() {
|
||||
userInfoEntity.value = null;
|
||||
token = null;
|
||||
refreshToken = null;
|
||||
loginType = null;
|
||||
|
||||
StorageService.to.write(AppStorageKey.userInfo.value, null);
|
||||
StorageService.to.write(AppStorageKey.token.value, null);
|
||||
StorageService.to.write(AppStorageKey.refreshToken.value, null);
|
||||
StorageService.to.write(AppStorageKey.loginType.value, null);
|
||||
// StorageService.to.erase();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ class LoginLogic extends GetxController with RequestToolMixin {
|
|||
BaseStructureResult<UserInfoEntity> res = await getClient().login(state.userNameController.text, md5.convert(utf8.encode(state.passwordController.text)).toString());
|
||||
if (null != res.data) {
|
||||
UserStore.to.setToken(res.data!.token);
|
||||
UserStore.to.setRefreshToken(res.data!.refreshToken);
|
||||
UserStore.to.setUserDetailInfo(res.data!);
|
||||
UserStore.to.setLoginType(AppConfig.NORMAL_LOGIN);
|
||||
Get.offAllNamed(Routes.startPage);
|
||||
|
|
@ -86,6 +87,7 @@ class LoginLogic extends GetxController with RequestToolMixin {
|
|||
BaseStructureResult<UserInfoEntity> res = await getClient().anonLogin(await DeviceInfo.getDeviceId(),state.nickNameCodeController.text, state.meetingCodeController.text);
|
||||
if (null != res.data) {
|
||||
UserStore.to.setToken(res.data!.token);
|
||||
UserStore.to.setRefreshToken(res.data!.refreshToken);
|
||||
UserStore.to.setUserDetailInfo(res.data!);
|
||||
UserStore.to.setLoginType(AppConfig.ANONYMOUS_LOGIN);
|
||||
Get.toNamed(Routes.meetingMainPage, arguments: {"roomNumber": state.meetingCodeController.text});
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|||
import 'package:get/get.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:signalr_core/signalr_core.dart';
|
||||
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||
import 'package:wgshare/common/store/user_store.dart';
|
||||
import 'package:wgshare/utils/count_microphone_volume.dart';
|
||||
import '../../common/config/request_config.dart';
|
||||
|
|
@ -18,6 +19,7 @@ import '../../common/models/meeting_room_info.dart';
|
|||
import '../../common/models/meeting_room_msg.dart';
|
||||
import '../../common/models/meeting_room_user.dart';
|
||||
import '../../common/store/business_store.dart';
|
||||
import '../../routes/app_routes.dart';
|
||||
import '../../utils/agora/AgoraUtil.dart';
|
||||
import '../../utils/permission/PermissionService.dart';
|
||||
import '../../utils/toast_utils.dart';
|
||||
|
|
@ -34,6 +36,9 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
var data = Get.arguments;
|
||||
state.roomNumber.value = data["roomNumber"];
|
||||
|
||||
// 开启屏幕常亮
|
||||
WakelockPlus.enable();
|
||||
|
||||
doHttpGetMeetingToken(true);
|
||||
}
|
||||
|
||||
|
|
@ -45,6 +50,10 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
state.sendMsgController.dispose();
|
||||
state.pageController.dispose();
|
||||
stopTime();
|
||||
|
||||
// 关闭屏幕常亮
|
||||
WakelockPlus.disable();
|
||||
|
||||
leaveMeetingToRtc();
|
||||
leaveMeetingToSocket();
|
||||
}
|
||||
|
|
@ -152,6 +161,24 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
update();
|
||||
}
|
||||
|
||||
/// 点击grid切换大屏
|
||||
void checkLargeScreen(String uid){
|
||||
ToastUtils.showSuccess("切换用户成功");
|
||||
if(uid == UserStore.to.userInfoEntity.value!.uid) {
|
||||
state.remoteUid.value = "0";
|
||||
}else{
|
||||
if(state.isSpeak.value == true && state.isOpenCamera.value == true){
|
||||
state.floating.value?.open(Get.context!);
|
||||
}
|
||||
state.remoteUid.value = uid;
|
||||
}
|
||||
changePageState(0);
|
||||
Future.delayed(const Duration(milliseconds: 200), () {
|
||||
changePageState(1);
|
||||
});
|
||||
update();
|
||||
}
|
||||
|
||||
/// ------------------------------------------------------------------------------发言权限
|
||||
/// 申请发言权限
|
||||
Future<void> doHttpApplySpeak() async {
|
||||
|
|
@ -181,6 +208,10 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
/// ------------------------------------------------------------------------------麦克风相关(操作)
|
||||
/// 用户开闭麦
|
||||
Future<void> doHttpSetMicr(bool isOpenMicrophone) async {
|
||||
if(isOpenMicrophone == false){
|
||||
state.spokesman.value = "";
|
||||
state.spokesmanVolume.value = 0;
|
||||
}
|
||||
await getClient().setMicr(state.roomNumber.value, isOpenMicrophone,
|
||||
UserStore.to.userInfoEntity.value!.uid);
|
||||
}
|
||||
|
|
@ -202,6 +233,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
BaseStructureResult res =
|
||||
await getClient().getTvAnchor(state.roomNumber.value);
|
||||
state.remoteUid.value = res.data!.toString();
|
||||
state.remoteAssistantUid.value = res.data!.toString();
|
||||
debugPrint("wgs输出===:获取当前全员观看主播${res.data}");
|
||||
|
||||
if (res.data!.toString().length != 9) {
|
||||
|
|
@ -238,8 +270,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
// 判断当前会议室是否存在全员观看主播
|
||||
var isCurrentUserIsCamera = false;
|
||||
for (var i = 0; i < state.cacheUsers.value.length; i++) {
|
||||
if (state.remoteUid.value == state.cacheUsers.value[i].uid &&
|
||||
state.cacheUsers.value[i].enableCamera == true) {
|
||||
if (state.remoteUid.value == state.cacheUsers.value[i].uid && state.cacheUsers.value[i].enableCamera == true) {
|
||||
isCurrentUserIsCamera = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -254,11 +285,13 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
} else {
|
||||
// 当前会议室不存在全员观看主播时,设置主播ID为空并切换页面到视频状态
|
||||
debugPrint("wgs输出===:当前会议室不存在全员观看主播时,设置主播ID为空并切换页面到视频状态");
|
||||
state.remoteUid.value = "";
|
||||
// state.remoteUid.value = "";
|
||||
state.remoteAssistantUid.value = "";
|
||||
changePageState(1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
debugPrint("wgs输出===:当前全员观看是共享类型");
|
||||
if (state.remoteUid.value ==
|
||||
UserStore.to.userInfoEntity.value!.screenShareId) {
|
||||
// 如果是自己在共享
|
||||
|
|
@ -270,6 +303,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
state.cacheUsers.value[i].enableShare = true;
|
||||
}
|
||||
}
|
||||
changePageState(1);
|
||||
}
|
||||
}
|
||||
update();
|
||||
|
|
@ -538,7 +572,9 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
}
|
||||
state.users.value = state.cacheUsers.value;
|
||||
update();
|
||||
if(listDynamic[0] != UserStore.to.userInfoEntity.value!.uid){
|
||||
doHttpGetTvAnchor();
|
||||
}
|
||||
debugPrint("wgs输出===:Socket-远端用户或主播离开会议室:$jsonStr");
|
||||
});
|
||||
|
||||
|
|
@ -564,6 +600,20 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
});
|
||||
});
|
||||
|
||||
/// 强制退出
|
||||
state.hubConnection.value?.on("ForceLogout", (e) {
|
||||
// var jsonStr = const Utf8Decoder().convert(json.encode(uid).runes.toList());
|
||||
var jsonStr = json.encode(e);
|
||||
List listDynamic = jsonDecode(jsonStr);
|
||||
debugPrint("wgs输出===:Socket-强制退出:${listDynamic[0]}");
|
||||
state.isNormaExit.value = true;
|
||||
ToastUtils.showSuccess("${listDynamic[0]}");
|
||||
Future.delayed(const Duration(seconds: 1), () {
|
||||
UserStore.to.erase();
|
||||
Get.offAllNamed(Routes.loginPage);
|
||||
});
|
||||
});
|
||||
|
||||
/// ------------------------------------------------------------------------------会议室聊天相关回调
|
||||
/// 会议室接收消息回调
|
||||
state.hubConnection.value?.on("ReceiveMessage", (e) {
|
||||
|
|
@ -574,10 +624,12 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
MeetingRoomMsg meetingRoomMsg = MeetingRoomMsg(list[0], list[1], list[2],
|
||||
0, formatDate(dateTime, [HH, ':', nn, ':', ss]));
|
||||
state.meetingRoomMsgs.value.add(meetingRoomMsg);
|
||||
state.msgNum.value = state.msgNum.value += 1;
|
||||
update();
|
||||
Future.delayed(const Duration(milliseconds: 100), () {
|
||||
state.chatController
|
||||
.jumpTo(state.chatController.position.maxScrollExtent);
|
||||
state.msgNum.value = 0;
|
||||
});
|
||||
debugPrint("wgs输出===:Socket-会议室接收消息:$jsonStr");
|
||||
});
|
||||
|
|
@ -590,13 +642,17 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
var listDynamic = jsonDecode(jsonStr);
|
||||
MeetingRoomUser meetingRoomUser = MeetingRoomUser.fromJson(listDynamic);
|
||||
if (meetingRoomUser.enableCamera == true) {
|
||||
debugPrint("wgs输出===:Socket-用户单独开摄像头");
|
||||
debugPrint("wgs输出===:Socket-用户单独开摄像头${jsonStr}");
|
||||
|
||||
// 遍历会议室用户列表,更改摄像头状态
|
||||
for (MeetingRoomUser mru in state.cacheUsers.value) {
|
||||
if (mru.uid == meetingRoomUser.uid) {
|
||||
mru.enableCamera = true;
|
||||
}
|
||||
debugPrint("wgs输出===:Socket-用户单独开摄像头---${state.remoteUid.value}--${meetingRoomUser.uid}");
|
||||
if(state.remoteUid.value == meetingRoomUser.uid){
|
||||
doHttpGetTvAnchor();
|
||||
}
|
||||
}
|
||||
|
||||
if (meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid) {
|
||||
|
|
@ -659,7 +715,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
/// isAgain:是否重新加入
|
||||
Future<void> joinMeetingToSocket(bool isAgain) async {
|
||||
await state.hubConnection.value?.invoke("joinChannel",
|
||||
args: [state.roomNumber.value, false, false, false]);
|
||||
args: [state.roomNumber.value, state.isOpenMicrophone.value, state.isOpenCamera.value, state.isSpeak.value]);
|
||||
mergeFetch(isAgain);
|
||||
/*if(isAgain == false){
|
||||
mergeFetch(isAgain);
|
||||
|
|
@ -809,13 +865,14 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
|||
for (MeetingRoomUser mru in state.cacheUsers.value) {
|
||||
// 用于更改语音布局里的用户列表麦克风
|
||||
if (avi.uid == 0) {
|
||||
//debugPrint("wgs输出===:RTC-用户音量提示(自己):${CountMicrophoneVolume.getVolume(avi.volume!)}");
|
||||
// debugPrint("wgs输出===:RTC-用户音量提示(自己):${CountMicrophoneVolume.getVolume(avi.volume!)}");
|
||||
mru.volume = CountMicrophoneVolume.getVolume(avi.volume!);
|
||||
state.microphoneVolume.value =
|
||||
CountMicrophoneVolume.getVolume(avi.volume!);
|
||||
} else {
|
||||
debugPrint("wgs输出===:RTC-用户音量提示:${avi.uid}--${mru.uid}");
|
||||
if (avi.uid.toString() == mru.uid) {
|
||||
//debugPrint("wgs输出===:RTC-用户音量提示(远端用户):${speakers[0].uid}--${speakers[0].volume}");
|
||||
debugPrint("wgs输出===:RTC-用户音量提示(远端用户):${speakers[0].uid}--${speakers[0].volume}");
|
||||
mru.volume = CountMicrophoneVolume.getVolume(avi.volume!);
|
||||
|
||||
if (avi.volume != 0) {
|
||||
|
|
|
|||
|
|
@ -79,6 +79,8 @@ class MeetingMainState {
|
|||
late RxBool isOpenShare = false.obs;
|
||||
/// 当前视频主播ID
|
||||
late RxString remoteUid = "".obs;
|
||||
/// 当前视频主播ID-辅助判断用
|
||||
late RxString remoteAssistantUid = "".obs;
|
||||
/// 是否成功加入会议室
|
||||
late RxBool isJoinSuccess = false.obs;
|
||||
|
||||
|
|
@ -90,6 +92,9 @@ class MeetingMainState {
|
|||
/// 聊天数据
|
||||
late RxList<MeetingRoomMsg> meetingRoomMsgs = RxList([]);
|
||||
|
||||
/// 聊天消息未读数量
|
||||
late RxInt msgNum = 0.obs;
|
||||
|
||||
/// signalR 长连接相关
|
||||
late RxString serviceUrl = "http://192.168.2.9:5192/session-manage".obs;
|
||||
late Rx<HubConnection?> hubConnection = Rx(null);
|
||||
|
|
|
|||
|
|
@ -325,7 +325,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
crossAxisAlignment:
|
||||
CrossAxisAlignment.center,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/images/meeting_main_chat.png',
|
||||
|
|
@ -342,11 +344,36 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
)
|
||||
],
|
||||
),
|
||||
Visibility(
|
||||
visible: state.msgNum.value > 0 ? true : false,
|
||||
child: Container(
|
||||
width: 18.w,
|
||||
height: 18.h,
|
||||
alignment: Alignment.center,
|
||||
margin: const EdgeInsets.only(right: 12),
|
||||
decoration: const BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(20)),
|
||||
color: ColorUtil.Color_255_69_69,
|
||||
),
|
||||
child: Text(
|
||||
"${state.msgNum.value}",
|
||||
style: TextStyle(
|
||||
fontSize: 12.sp,
|
||||
color: ColorUtil
|
||||
.Color_255_255_255),
|
||||
)
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
Get.bottomSheet(
|
||||
isScrollControlled: true,
|
||||
chatBottomSheet(context));
|
||||
|
||||
state.msgNum.value = 0;
|
||||
|
||||
Future.delayed(
|
||||
const Duration(milliseconds: 100),
|
||||
() {
|
||||
|
|
@ -400,6 +427,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
children: [
|
||||
/// 音频
|
||||
GestureDetector(
|
||||
child: Container(
|
||||
padding: const EdgeInsets.only(left: 6,right: 6),
|
||||
color: ColorUtil.Color_0_0_0_0,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
|
|
@ -452,6 +482,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
if (state.isSpeak.value == false) {
|
||||
Get.bottomSheet(
|
||||
|
|
@ -471,6 +502,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
|
||||
/// 视频
|
||||
GestureDetector(
|
||||
child: Container(
|
||||
padding: const EdgeInsets.only(left: 6,right: 6),
|
||||
color: ColorUtil.Color_0_0_0_0,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
|
|
@ -497,6 +531,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
if (state.isSpeak.value == false) {
|
||||
Get.bottomSheet(
|
||||
|
|
@ -549,6 +584,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
|
||||
/// 成员
|
||||
GestureDetector(
|
||||
child: Container(
|
||||
padding: const EdgeInsets.only(left: 6,right: 6),
|
||||
color: ColorUtil.Color_0_0_0_0,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
|
|
@ -566,6 +604,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
Get.bottomSheet(
|
||||
isScrollControlled: true,
|
||||
|
|
@ -1626,7 +1665,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
return Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
state.remoteUid.value != ""
|
||||
state.remoteAssistantUid.value != ""
|
||||
? AgoraVideoView(
|
||||
controller: VideoViewController(
|
||||
rtcEngine: state.rctEngine.value!,
|
||||
|
|
@ -1708,7 +1747,8 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
crossAxisCount: 2, childAspectRatio: 0.8, crossAxisSpacing: 0),
|
||||
itemCount: state.cacheUsers.value.length,
|
||||
itemBuilder: (BuildContext ctx, index) {
|
||||
return Stack(
|
||||
return GestureDetector(
|
||||
child: Stack(
|
||||
children: [
|
||||
state.cacheUsers.value[index].enableCamera == true
|
||||
? state.cacheUsers.value[index].uid ==
|
||||
|
|
@ -1841,6 +1881,14 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
|||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
onTap: (){
|
||||
if(state.cacheUsers.value[index].enableCamera == true){
|
||||
logic.checkLargeScreen(state.cacheUsers.value[index].uid);
|
||||
}else{
|
||||
ToastUtils.showError("该用户暂未开启摄像头");
|
||||
}
|
||||
},
|
||||
);
|
||||
}),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -7,10 +7,4 @@ import 'user_state.dart';
|
|||
|
||||
class UserLogic extends GetxController with RequestToolMixin {
|
||||
final UserState state = UserState();
|
||||
|
||||
/// 退出登录
|
||||
void logout(){
|
||||
UserStore.to.erase();
|
||||
Get.toNamed(Routes.loginPage);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ import macos_window_utils
|
|||
import package_info_plus
|
||||
import path_provider_foundation
|
||||
import sqflite_darwin
|
||||
import wakelock_plus
|
||||
|
||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
AgoraRtcNgPlugin.register(with: registry.registrar(forPlugin: "AgoraRtcNgPlugin"))
|
||||
|
|
@ -31,4 +32,5 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||
WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -254,6 +254,14 @@ packages:
|
|||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.9"
|
||||
dbus:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dbus
|
||||
sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.7.10"
|
||||
device_info_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -694,10 +702,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
|
||||
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.7.1"
|
||||
version: "0.6.7"
|
||||
json_annotation:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -962,6 +970,14 @@ packages:
|
|||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.2.1"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: petitparser
|
||||
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "6.0.2"
|
||||
photo_view:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -1295,6 +1311,22 @@ packages:
|
|||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "14.2.5"
|
||||
wakelock_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: wakelock_plus
|
||||
sha256: "36c88af0b930121941345306d259ec4cc4ecca3b151c02e3a9e71aede83c615e"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.10"
|
||||
wakelock_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wakelock_plus_platform_interface
|
||||
sha256: "70e780bc99796e1db82fe764b1e7dcb89a86f1e5b3afb1db354de50f2e41eb7a"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.2"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1343,6 +1375,14 @@ packages:
|
|||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xml
|
||||
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "6.5.0"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -101,6 +101,9 @@ dependencies:
|
|||
# 后台下载
|
||||
al_downloader: ^1.8.2
|
||||
|
||||
# 屏幕常亮
|
||||
wakelock_plus: ^1.2.10
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
|
|
|||
Loading…
Reference in New Issue