Merge branch 'dev'
This commit is contained in:
commit
8df34b0fa7
Binary file not shown.
|
After Width: | Height: | Size: 929 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 460 B |
|
|
@ -42,6 +42,12 @@ abstract class RetrofitClient {
|
||||||
@Path("roomNum") String roomNum,
|
@Path("roomNum") String roomNum,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/// 检验房间是否存在
|
||||||
|
@GET("/room/checkout")
|
||||||
|
Future<BaseStructureResult<bool>> checkout(
|
||||||
|
@Query("roomNum") String roomNum,
|
||||||
|
);
|
||||||
|
|
||||||
/// 获取会议室所有用户
|
/// 获取会议室所有用户
|
||||||
@GET("/room/user")
|
@GET("/room/user")
|
||||||
Future<BaseStructureResult<List<MeetingRoomUser>>> getMeetingRoomAllUser(
|
Future<BaseStructureResult<List<MeetingRoomUser>>> getMeetingRoomAllUser(
|
||||||
|
|
|
||||||
|
|
@ -21,4 +21,9 @@ class AppConfig {
|
||||||
static const paddingLeft = 20.0;
|
static const paddingLeft = 20.0;
|
||||||
static const paddingRight = 20.0;
|
static const paddingRight = 20.0;
|
||||||
static const paddingbottom = 20.0;
|
static const paddingbottom = 20.0;
|
||||||
|
|
||||||
|
// 正常登录
|
||||||
|
static const NORMAL_LOGIN = "normal_login";
|
||||||
|
// 匿名登录
|
||||||
|
static const ANONYMOUS_LOGIN = "anonymous_login";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,9 @@ class MeetingRoomMsg extends Object{
|
||||||
// 0:别人,1:自己
|
// 0:别人,1:自己
|
||||||
int source;
|
int source;
|
||||||
|
|
||||||
MeetingRoomMsg(this.uid,this.userName,this.message,this.source);
|
String time;
|
||||||
|
|
||||||
|
MeetingRoomMsg(this.uid,this.userName,this.message,this.source,this.time);
|
||||||
|
|
||||||
factory MeetingRoomMsg.fromJson(Map<String, dynamic> srcJson) => _$MeetingRoomMsgFromJson(srcJson);
|
factory MeetingRoomMsg.fromJson(Map<String, dynamic> srcJson) => _$MeetingRoomMsgFromJson(srcJson);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,10 @@ class MeetingRoomUser extends Object{
|
||||||
@JsonKey(name: 'volume')
|
@JsonKey(name: 'volume')
|
||||||
double? volume = 0.0;
|
double? volume = 0.0;
|
||||||
|
|
||||||
MeetingRoomUser(this.uid,this.connectId,this.account,this.enableMicr,this.enableCamera,this.screenShareId,this.userName,this.roleId,this.roleName,this.isRoomManager,this.volume);
|
@JsonKey(name: 'enableShare')
|
||||||
|
bool? enableShare = false;
|
||||||
|
|
||||||
|
MeetingRoomUser(this.uid,this.connectId,this.account,this.enableMicr,this.enableCamera,this.screenShareId,this.userName,this.roleId,this.roleName,this.isRoomManager,this.volume,this.enableShare);
|
||||||
|
|
||||||
factory MeetingRoomUser.fromJson(Map<String, dynamic> srcJson) => _$MeetingRoomUserFromJson(srcJson);
|
factory MeetingRoomUser.fromJson(Map<String, dynamic> srcJson) => _$MeetingRoomUserFromJson(srcJson);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,8 @@ enum AppStorageKey {
|
||||||
token(value: 'TOKEN', label: "登录用户的token"),
|
token(value: 'TOKEN', label: "登录用户的token"),
|
||||||
userInfo(value: 'USERINFO', label: "登录用户的基本信息"),
|
userInfo(value: 'USERINFO', label: "登录用户的基本信息"),
|
||||||
account(value: 'ACCOUNT', label: "用户名"),
|
account(value: 'ACCOUNT', label: "用户名"),
|
||||||
pwd(value: 'PWD', label: "密码");
|
pwd(value: 'PWD', label: "密码"),
|
||||||
|
loginType(value: 'LOGINTYPE', label: "登录类型");
|
||||||
|
|
||||||
final String label;
|
final String label;
|
||||||
final String value;
|
final String value;
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,14 @@ class UserStore extends GetxController with RequestToolMixin {
|
||||||
/// 是否登录
|
/// 是否登录
|
||||||
String? token;
|
String? token;
|
||||||
|
|
||||||
|
/// 登录类型
|
||||||
|
String? loginType;
|
||||||
|
|
||||||
/// 用户信息
|
/// 用户信息
|
||||||
Rx<UserInfoEntity?> userInfoEntity = Rx(null);
|
Rx<UserInfoEntity?> userInfoEntity = Rx(null);
|
||||||
|
|
||||||
UserStore init() {
|
UserStore init() {
|
||||||
|
loginType = StorageService.to.read(AppStorageKey.loginType.value);
|
||||||
token = StorageService.to.read(AppStorageKey.token.value);
|
token = StorageService.to.read(AppStorageKey.token.value);
|
||||||
try {
|
try {
|
||||||
var userDetail = StorageService.to.read(AppStorageKey.userInfo.value);
|
var userDetail = StorageService.to.read(AppStorageKey.userInfo.value);
|
||||||
|
|
@ -41,6 +45,12 @@ class UserStore extends GetxController with RequestToolMixin {
|
||||||
StorageService.to.write(AppStorageKey.token.value, token);
|
StorageService.to.write(AppStorageKey.token.value, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 保存登录类型
|
||||||
|
void setLoginType(String loginType) {
|
||||||
|
this.loginType = loginType;
|
||||||
|
StorageService.to.write(AppStorageKey.loginType.value, loginType);
|
||||||
|
}
|
||||||
|
|
||||||
/// 保存用户信息
|
/// 保存用户信息
|
||||||
void setUserDetailInfo(UserInfoEntity info) {
|
void setUserDetailInfo(UserInfoEntity info) {
|
||||||
userInfoEntity.value = info;
|
userInfoEntity.value = info;
|
||||||
|
|
@ -51,6 +61,7 @@ class UserStore extends GetxController with RequestToolMixin {
|
||||||
void erase() {
|
void erase() {
|
||||||
userInfoEntity.value = null;
|
userInfoEntity.value = null;
|
||||||
token = null;
|
token = null;
|
||||||
|
loginType = null;
|
||||||
|
|
||||||
StorageService.to.erase();
|
StorageService.to.erase();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import 'package:wgshare/utils/package_info_util.dart';
|
||||||
import 'package:wgshare/utils/storage.dart';
|
import 'package:wgshare/utils/storage.dart';
|
||||||
import 'package:wgshare/utils/utils.dart';
|
import 'package:wgshare/utils/utils.dart';
|
||||||
|
|
||||||
|
import 'common/config/app_config.dart';
|
||||||
import 'common/config/colorUtils.dart';
|
import 'common/config/colorUtils.dart';
|
||||||
import 'routes/app_pages.dart';
|
import 'routes/app_pages.dart';
|
||||||
import 'routes/app_routes.dart';
|
import 'routes/app_routes.dart';
|
||||||
|
|
@ -79,7 +80,9 @@ class MyApp extends StatelessWidget {
|
||||||
//默认专场动画
|
//默认专场动画
|
||||||
defaultTransition: Transition.fade,
|
defaultTransition: Transition.fade,
|
||||||
//初始化路由页面
|
//初始化路由页面
|
||||||
initialRoute: (UserStore.to.token?.isNotEmpty ?? false) && UserStore.to.userInfoEntity.value != null ? Routes.startPage : Routes.loginPage,
|
initialRoute: (UserStore.to.token?.isNotEmpty ?? false) && UserStore.to.userInfoEntity.value != null && UserStore.to.loginType != null && UserStore.to.loginType == AppConfig.NORMAL_LOGIN
|
||||||
|
? Routes.startPage
|
||||||
|
: Routes.loginPage,
|
||||||
|
|
||||||
/// 路由表
|
/// 路由表
|
||||||
getPages: AppPages.pages,
|
getPages: AppPages.pages,
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,12 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:signalr_core/signalr_core.dart';
|
import 'package:signalr_core/signalr_core.dart';
|
||||||
import 'package:wgshare/common/models/common/base_structure_result.dart';
|
import 'package:wgshare/common/models/common/base_structure_result.dart';
|
||||||
import 'package:wgshare/common/mixins/request_tool_mixin.dart';
|
import 'package:wgshare/common/mixins/request_tool_mixin.dart';
|
||||||
|
import 'package:wgshare/common/store/user_store.dart';
|
||||||
|
|
||||||
import '../../common/models/meeting_room_item.dart';
|
import '../../common/models/meeting_room_item.dart';
|
||||||
|
import '../../utils/toast_utils.dart';
|
||||||
import 'home_state.dart';
|
import 'home_state.dart';
|
||||||
|
|
||||||
class HomeLogic extends GetxController with RequestToolMixin {
|
class HomeLogic extends GetxController with RequestToolMixin {
|
||||||
|
|
@ -22,8 +25,9 @@ class HomeLogic extends GetxController with RequestToolMixin {
|
||||||
state.refreshController.dispose();
|
state.refreshController.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 直接进入会议(匿名登录)
|
/// 获取会议列表
|
||||||
Future<void> doHttpGetMeetingRoomList(int pageIndex, int pageSize) async {
|
Future<void> doHttpGetMeetingRoomList(int pageIndex, int pageSize) async {
|
||||||
|
debugPrint("wgs输出===:token:${UserStore.to.token}");
|
||||||
BaseStructureResult<MeetingRoomItem> res = await getClient().getMeetingRoomList(pageIndex,pageSize);
|
BaseStructureResult<MeetingRoomItem> res = await getClient().getMeetingRoomList(pageIndex,pageSize);
|
||||||
if(null != res.data){
|
if(null != res.data){
|
||||||
if(state.pageIndex == 1){
|
if(state.pageIndex == 1){
|
||||||
|
|
@ -54,4 +58,20 @@ class HomeLogic extends GetxController with RequestToolMixin {
|
||||||
doHttpGetMeetingRoomList(state.pageIndex.value,state.pageSize.value);
|
doHttpGetMeetingRoomList(state.pageIndex.value,state.pageSize.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 返回键退出
|
||||||
|
bool closeOnConfirm(BuildContext context) {
|
||||||
|
DateTime now = DateTime.now();
|
||||||
|
// 物理键,两次间隔大于4秒, 退出请求无效
|
||||||
|
if (state.currentBackPressTime == null ||
|
||||||
|
now.difference(state.currentBackPressTime!) > const Duration(seconds: 4)) {
|
||||||
|
state.currentBackPressTime = now;
|
||||||
|
ToastUtils.showInfo("再按一次退出");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// 退出请求有效
|
||||||
|
state.currentBackPressTime = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,4 +25,7 @@ class HomeState {
|
||||||
/// 总页数
|
/// 总页数
|
||||||
final RxInt totalPage = 0.obs;
|
final RxInt totalPage = 0.obs;
|
||||||
|
|
||||||
|
/// 退出计时
|
||||||
|
DateTime? currentBackPressTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ class HomePage extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
|
|
||||||
final logic = Get.put(HomeLogic());
|
final logic = Get.put(HomeLogic());
|
||||||
final state = Get.find<HomeLogic>().state;
|
final state = Get.find<HomeLogic>().state;
|
||||||
|
|
||||||
|
|
@ -36,7 +35,18 @@ class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
super.build(context);
|
super.build(context);
|
||||||
return Scaffold(
|
return PopScope(
|
||||||
|
canPop: false,
|
||||||
|
onPopInvoked: (bool didPop) async {
|
||||||
|
if (didPop) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (logic.closeOnConfirm(context)) {
|
||||||
|
// 系统级别导航栈 退出程序
|
||||||
|
SystemNavigator.pop();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
surfaceTintColor: Colors.white,
|
surfaceTintColor: Colors.white,
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
|
|
@ -62,8 +72,7 @@ class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16.sp,
|
fontSize: 16.sp,
|
||||||
color: ColorUtil.Color_51_51_51,
|
color: ColorUtil.Color_51_51_51,
|
||||||
fontWeight: FontWeight.w500
|
fontWeight: FontWeight.w500),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
|
@ -79,23 +88,28 @@ class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
return Container(
|
return Container(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
borderRadius: BorderRadius.all(Radius.circular(6)),
|
borderRadius:
|
||||||
|
BorderRadius.all(Radius.circular(6)),
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
margin: EdgeInsets.only(top: index == 0 ? 20 : 12, bottom: index == 19 ? 20 : 0, left: 16, right: 16),
|
margin: EdgeInsets.only(
|
||||||
|
top: index == 0 ? 20 : 12,
|
||||||
|
bottom: index == 19 ? 20 : 0,
|
||||||
|
left: 16,
|
||||||
|
right: 16),
|
||||||
padding: const EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
state.meetingRooms.value[index].roomName,
|
state.meetingRooms.value[index].roomName,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14.sp,
|
fontSize: 14.sp,
|
||||||
color: ColorUtil.Color_89_88_88,
|
color: ColorUtil.Color_89_88_88,
|
||||||
fontWeight: FontWeight.w500
|
fontWeight: FontWeight.w500),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
|
|
@ -117,12 +131,14 @@ class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
),
|
),
|
||||||
SizedBox(height: 20.h),
|
SizedBox(height: 20.h),
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
state.meetingRooms.value[index].roomNum,
|
state.meetingRooms.value[index]
|
||||||
|
.roomNum,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 12.sp,
|
fontSize: 12.sp,
|
||||||
color: ColorUtil.Color_177_177_177,
|
color: ColorUtil.Color_177_177_177,
|
||||||
|
|
@ -136,7 +152,9 @@ class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
height: 16.h,
|
height: 16.h,
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Clipboard.setData(ClipboardData(text: state.meetingRooms.value[index].roomNum));
|
Clipboard.setData(ClipboardData(
|
||||||
|
text: state.meetingRooms
|
||||||
|
.value[index].roomNum));
|
||||||
ToastUtils.showSuccess("复制成功");
|
ToastUtils.showSuccess("复制成功");
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
@ -147,11 +165,13 @@ class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
width: 78.w,
|
width: 78.w,
|
||||||
height: 30.h,
|
height: 30.h,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: const BorderRadius.all(Radius.circular(6)),
|
borderRadius: const BorderRadius.all(
|
||||||
|
Radius.circular(6)),
|
||||||
color: ColorUtil.Color_85_117_242,
|
color: ColorUtil.Color_85_117_242,
|
||||||
),
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'进入',
|
'进入',
|
||||||
|
|
@ -169,7 +189,11 @@ class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Get.toNamed(Routes.meetingMainPage, arguments: {"roomNumber": state.meetingRooms.value[index].roomNum});
|
Get.toNamed(Routes.meetingMainPage,
|
||||||
|
arguments: {
|
||||||
|
"roomNumber": state.meetingRooms
|
||||||
|
.value[index].roomNum
|
||||||
|
});
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|
@ -184,7 +208,7 @@ class HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
))
|
))),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import 'package:wgshare/common/mixins/request_tool_mixin.dart';
|
||||||
import 'package:wgshare/utils/device_info.dart';
|
import 'package:wgshare/utils/device_info.dart';
|
||||||
import 'package:wgshare/utils/toast_utils.dart';
|
import 'package:wgshare/utils/toast_utils.dart';
|
||||||
|
|
||||||
|
import '../../common/config/app_config.dart';
|
||||||
import '../../common/models/common/base_structure_result.dart';
|
import '../../common/models/common/base_structure_result.dart';
|
||||||
import '../../common/models/user_info_entity.dart';
|
import '../../common/models/user_info_entity.dart';
|
||||||
import '../../common/store/app_storage_key.dart';
|
import '../../common/store/app_storage_key.dart';
|
||||||
|
|
@ -46,16 +47,17 @@ class LoginLogic extends GetxController with RequestToolMixin {
|
||||||
}else if(state.checkAgreementBool.value != true){
|
}else if(state.checkAgreementBool.value != true){
|
||||||
ToastUtils.showError("请阅读并勾选相关协议");
|
ToastUtils.showError("请阅读并勾选相关协议");
|
||||||
}else{
|
}else{
|
||||||
try{
|
|
||||||
ToastUtils.showLoading();
|
|
||||||
BaseStructureResult<UserInfoEntity> res = await getClient().login(state.userNameController.text, md5.convert(utf8.encode(state.passwordController.text)).toString());
|
BaseStructureResult<UserInfoEntity> res = await getClient().login(state.userNameController.text, md5.convert(utf8.encode(state.passwordController.text)).toString());
|
||||||
if (null != res.data) {
|
if (null != res.data) {
|
||||||
UserStore.to.setToken(res.data!.token);
|
UserStore.to.setToken(res.data!.token);
|
||||||
UserStore.to.setUserDetailInfo(res.data!);
|
UserStore.to.setUserDetailInfo(res.data!);
|
||||||
Get.toNamed(Routes.startPage);
|
UserStore.to.setLoginType(AppConfig.NORMAL_LOGIN);
|
||||||
}
|
Get.offAllNamed(Routes.startPage);
|
||||||
}finally{
|
state.userNameController.text = "";
|
||||||
ToastUtils.dismiss();
|
state.passwordController.text = "";
|
||||||
|
state.meetingCodeController.text = "";
|
||||||
|
state.nickNameCodeController.text = "";
|
||||||
|
state.checkAgreementBool.value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -71,16 +73,39 @@ class LoginLogic extends GetxController with RequestToolMixin {
|
||||||
}else if(state.checkAgreementBool != true){
|
}else if(state.checkAgreementBool != true){
|
||||||
ToastUtils.showError("请阅读并勾选相关协议");
|
ToastUtils.showError("请阅读并勾选相关协议");
|
||||||
}else{
|
}else{
|
||||||
try{
|
|
||||||
ToastUtils.showLoading();
|
|
||||||
BaseStructureResult<UserInfoEntity> res = await getClient().anonLogin(await DeviceInfo.getDeviceId(),state.nickNameCodeController.text, state.meetingCodeController.text);
|
BaseStructureResult<UserInfoEntity> res = await getClient().anonLogin(await DeviceInfo.getDeviceId(),state.nickNameCodeController.text, state.meetingCodeController.text);
|
||||||
if (null != res.data) {
|
if (null != res.data) {
|
||||||
UserStore.to.setToken(res.data!.token);
|
UserStore.to.setToken(res.data!.token);
|
||||||
UserStore.to.setUserDetailInfo(res.data!);
|
UserStore.to.setUserDetailInfo(res.data!);
|
||||||
|
UserStore.to.setLoginType(AppConfig.ANONYMOUS_LOGIN);
|
||||||
Get.toNamed(Routes.meetingMainPage, arguments: {"roomNumber": state.meetingCodeController.text});
|
Get.toNamed(Routes.meetingMainPage, arguments: {"roomNumber": state.meetingCodeController.text});
|
||||||
|
state.userNameController.text = "";
|
||||||
|
state.passwordController.text = "";
|
||||||
|
state.meetingCodeController.text = "";
|
||||||
|
state.nickNameCodeController.text = "";
|
||||||
|
state.checkAgreementBool.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 检验房间
|
||||||
|
Future<void> doHttpCheckMeetingRoom() async {
|
||||||
|
if(state.meetingCodeController.text.isEmpty){
|
||||||
|
ToastUtils.showError("请输入会议号");
|
||||||
|
}else if(state.meetingCodeController.text.length != 8){
|
||||||
|
ToastUtils.showError("请输入正确的会议号");
|
||||||
|
}else if(state.nickNameCodeController.text.isEmpty){
|
||||||
|
ToastUtils.showError("请输入昵称");
|
||||||
|
}else if(state.checkAgreementBool != true){
|
||||||
|
ToastUtils.showError("请阅读并勾选相关协议");
|
||||||
|
}else{
|
||||||
|
BaseStructureResult<bool> res = await getClient().checkout(state.meetingCodeController.text);
|
||||||
|
if (null != res.data) {
|
||||||
|
if(res.data == true){
|
||||||
|
doHttpAnonymousLogin();
|
||||||
|
}else{
|
||||||
|
ToastUtils.showError("房间不存在");
|
||||||
}
|
}
|
||||||
}finally{
|
|
||||||
ToastUtils.dismiss();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -378,7 +378,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||||
if (state.pageState.value == 0) {
|
if (state.pageState.value == 0) {
|
||||||
logic.doHttpLogin();
|
logic.doHttpLogin();
|
||||||
} else {
|
} else {
|
||||||
logic.doHttpAnonymousLogin();
|
logic.doHttpCheckMeetingRoom();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,11 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'package:adaptive_dialog/adaptive_dialog.dart';
|
||||||
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
|
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
|
||||||
|
import 'package:date_format/date_format.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:signalr_core/signalr_core.dart';
|
import 'package:signalr_core/signalr_core.dart';
|
||||||
import 'package:wgshare/common/store/user_store.dart';
|
import 'package:wgshare/common/store/user_store.dart';
|
||||||
|
|
@ -13,6 +16,7 @@ import '../../common/models/common/base_structure_result.dart';
|
||||||
import '../../common/models/meeting_room_info.dart';
|
import '../../common/models/meeting_room_info.dart';
|
||||||
import '../../common/models/meeting_room_msg.dart';
|
import '../../common/models/meeting_room_msg.dart';
|
||||||
import '../../common/models/meeting_room_user.dart';
|
import '../../common/models/meeting_room_user.dart';
|
||||||
|
import '../../utils/agora/AgoraUtil.dart';
|
||||||
import '../../utils/permission/PermissionService.dart';
|
import '../../utils/permission/PermissionService.dart';
|
||||||
import '../../utils/toast_utils.dart';
|
import '../../utils/toast_utils.dart';
|
||||||
import 'meeting_main_state.dart';
|
import 'meeting_main_state.dart';
|
||||||
|
|
@ -50,17 +54,20 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
state.meetingToken.value = res.data!;
|
state.meetingToken.value = res.data!;
|
||||||
|
|
||||||
if (isInit == true) {
|
if (isInit == true) {
|
||||||
initRtc();
|
|
||||||
signalRSocket();
|
signalRSocket();
|
||||||
|
}else{
|
||||||
|
initRtc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 合并请求
|
/// 合并请求
|
||||||
/// 1.获取会议室信息
|
/// 1.获取会议室信息
|
||||||
/// 2.获取会议室所有用户
|
/// 2.获取会议室所有用户
|
||||||
Future<void> mergeFetch() async {
|
Future<void> mergeFetch(bool isAgain) async {
|
||||||
try {
|
try {
|
||||||
|
if (isAgain == false) {
|
||||||
ToastUtils.showLoading();
|
ToastUtils.showLoading();
|
||||||
|
}
|
||||||
|
|
||||||
var results = await Future.wait([
|
var results = await Future.wait([
|
||||||
getClient().getMeetingRoomInfo(state.roomNumber.value),
|
getClient().getMeetingRoomInfo(state.roomNumber.value),
|
||||||
|
|
@ -92,6 +99,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
/// 获取会议室信息
|
/// 获取会议室信息
|
||||||
void getMeetingRoomInfo(MeetingRoomInfo meetingRoomInfo) async {
|
void getMeetingRoomInfo(MeetingRoomInfo meetingRoomInfo) async {
|
||||||
state.meetingRoomInfo.value = meetingRoomInfo;
|
state.meetingRoomInfo.value = meetingRoomInfo;
|
||||||
|
initRtc();
|
||||||
startTime();
|
startTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,6 +107,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
void getMeetingRoomAllUser(List<MeetingRoomUser> meetingRoomUsers) async {
|
void getMeetingRoomAllUser(List<MeetingRoomUser> meetingRoomUsers) async {
|
||||||
state.users.value = meetingRoomUsers;
|
state.users.value = meetingRoomUsers;
|
||||||
state.cacheUsers.value = meetingRoomUsers;
|
state.cacheUsers.value = meetingRoomUsers;
|
||||||
|
update();
|
||||||
doHttpGetTvAnchor();
|
doHttpGetTvAnchor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -138,6 +147,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
} else {
|
} else {
|
||||||
state.users.value = state.cacheUsers.value;
|
state.users.value = state.cacheUsers.value;
|
||||||
}
|
}
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ------------------------------------------------------------------------------发言权限
|
/// ------------------------------------------------------------------------------发言权限
|
||||||
|
|
@ -195,6 +205,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
if (res.data!.toString().length != 9) {
|
if (res.data!.toString().length != 9) {
|
||||||
// 摄像头
|
// 摄像头
|
||||||
if (state.remoteUid.value == UserStore.to.userInfoEntity.value!.uid) {
|
if (state.remoteUid.value == UserStore.to.userInfoEntity.value!.uid) {
|
||||||
|
debugPrint("wgs输出===:当前全员观看是自己");
|
||||||
// 全员观看主播是自己
|
// 全员观看主播是自己
|
||||||
// 设置主播ID为0(自己)
|
// 设置主播ID为0(自己)
|
||||||
state.remoteUid.value = "0";
|
state.remoteUid.value = "0";
|
||||||
|
|
@ -205,10 +216,22 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
// 有发言权限且开启了摄像头时,切换页面到视频状态
|
// 有发言权限且开启了摄像头时,切换页面到视频状态
|
||||||
changePageState(1);
|
changePageState(1);
|
||||||
} else {
|
} else {
|
||||||
// 没有发言权限或没开启摄像头时,切换页面到语音状态
|
// 没有发言权限或没开启摄像头时,查看有没有其他人开摄像头,如果没有切换页面到语音状态,如果有切换到视频状态
|
||||||
|
var isOtherOpenCamera = false;
|
||||||
|
for (var i = 0; i < state.cacheUsers.value.length; i++) {
|
||||||
|
if (state.cacheUsers.value[i].enableCamera == true) {
|
||||||
|
isOtherOpenCamera = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(isOtherOpenCamera == false){
|
||||||
changePageState(0);
|
changePageState(0);
|
||||||
|
}else{
|
||||||
|
state.remoteUid.value = "";
|
||||||
|
changePageState(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
debugPrint("wgs输出===:当前全员观看不是自己");
|
||||||
// 全员观看主播不是自己
|
// 全员观看主播不是自己
|
||||||
// 判断当前会议室是否存在全员观看主播
|
// 判断当前会议室是否存在全员观看主播
|
||||||
var isCurrentUserIsCamera = false;
|
var isCurrentUserIsCamera = false;
|
||||||
|
|
@ -222,7 +245,10 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
if (isCurrentUserIsCamera == true) {
|
if (isCurrentUserIsCamera == true) {
|
||||||
// 当前会议室存在全员观看主播时,切换页面到视频状态
|
// 当前会议室存在全员观看主播时,切换页面到视频状态
|
||||||
debugPrint("wgs输出===:当前会议室存在全员观看主播时,切换页面到视频状态");
|
debugPrint("wgs输出===:当前会议室存在全员观看主播时,切换页面到视频状态");
|
||||||
|
changePageState(0);
|
||||||
|
Future.delayed(const Duration(milliseconds: 200), () {
|
||||||
changePageState(1);
|
changePageState(1);
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
// 当前会议室不存在全员观看主播时,设置主播ID为空并切换页面到视频状态
|
// 当前会议室不存在全员观看主播时,设置主播ID为空并切换页面到视频状态
|
||||||
debugPrint("wgs输出===:当前会议室不存在全员观看主播时,设置主播ID为空并切换页面到视频状态");
|
debugPrint("wgs输出===:当前会议室不存在全员观看主播时,设置主播ID为空并切换页面到视频状态");
|
||||||
|
|
@ -231,15 +257,21 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 共享屏幕(此版本不做)
|
if (state.remoteUid.value ==
|
||||||
/*if(state.remoteUid.value == UserStore.to.userInfoEntity.value!.screenShareId){
|
UserStore.to.userInfoEntity.value!.screenShareId) {
|
||||||
// 如果是自己在共享
|
// 如果是自己在共享
|
||||||
} else {
|
} else {
|
||||||
// 如果是别人在共享,切换页面到视频状态
|
// 共享不是自己
|
||||||
changePageState(1);
|
for (var i = 0; i < state.cacheUsers.value.length; i++) {
|
||||||
}*/
|
if (state.remoteUid.value ==
|
||||||
|
state.cacheUsers.value[i].screenShareId) {
|
||||||
|
state.cacheUsers.value[i].enableShare = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
/// 设置当前全员观看主播
|
/// 设置当前全员观看主播
|
||||||
Future<void> doHttpSetTvAnchor(String id) async {
|
Future<void> doHttpSetTvAnchor(String id) async {
|
||||||
|
|
@ -300,14 +332,52 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
accessTokenFactory: () async =>
|
accessTokenFactory: () async =>
|
||||||
await Future.value(UserStore.to.token),
|
await Future.value(UserStore.to.token),
|
||||||
logging: (level, message) =>
|
logging: (level, message) =>
|
||||||
debugPrint("wgs输出===:SignalR Socket-$message"),
|
debugPrint("wgs输出===:SignalR Socket-日志:$message"),
|
||||||
))
|
))
|
||||||
// 配置断线重连策略:默认重连4次,分别间隔10秒 4秒 10秒 10秒
|
// 配置断线重连策略:默认重连5次,分别间隔2秒 4秒 4秒 5秒 10秒
|
||||||
.withAutomaticReconnect([10000, 4000, 10000, 10000]).build();
|
.withAutomaticReconnect([2000, 4000, 4000, 5000, 10000]).build();
|
||||||
|
|
||||||
await state.hubConnection.value?.start();
|
await state.hubConnection.value?.start();
|
||||||
|
|
||||||
joinMeetingToSocket();
|
// 开始重新连接时回调
|
||||||
|
state.hubConnection.value?.onreconnecting((error) {
|
||||||
|
debugPrint("wgs输出===:SignalR Socket-重连$error");
|
||||||
|
if (EasyLoading.isShow == false) {
|
||||||
|
ToastUtils.showLoadingToMask("网络故障,正在重连...", EasyLoadingMaskType.black);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 重新连接成功时回调,5次重连任意一次成功就回调
|
||||||
|
state.hubConnection.value?.onreconnected((connectionId) {
|
||||||
|
debugPrint("wgs输出===:SignalR Socket-重连成功$connectionId");
|
||||||
|
joinMeetingToSocket(true);
|
||||||
|
ToastUtils.dismiss();
|
||||||
|
if (EasyLoading.isShow == false) {
|
||||||
|
ToastUtils.showSuccessToMask("重连成功!", EasyLoadingMaskType.black);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 重新连接失败时回调,5次重连都失败才回调
|
||||||
|
state.hubConnection.value?.onclose((error) {
|
||||||
|
debugPrint("wgs输出===:SignalR Socket-重连失败$error");
|
||||||
|
ToastUtils.dismiss();
|
||||||
|
|
||||||
|
if (state.isNormaExit.value == false &&
|
||||||
|
state.isShowOkAlertDialog.value == false) {
|
||||||
|
showOkAlertDialog(
|
||||||
|
context: Get.context!,
|
||||||
|
title: "提示",
|
||||||
|
message: "网络错误,请重新加入会议室",
|
||||||
|
okLabel: "确定",
|
||||||
|
barrierDismissible: false,
|
||||||
|
).then((OkCancelResult value) {
|
||||||
|
Get.back();
|
||||||
|
Get.back();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
joinMeetingToSocket(false);
|
||||||
|
|
||||||
/// ------------------------------------------------------------------------------发言权限相关回调
|
/// ------------------------------------------------------------------------------发言权限相关回调
|
||||||
/// 开启关闭发言权限
|
/// 开启关闭发言权限
|
||||||
|
|
@ -321,13 +391,22 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
for (MeetingRoomUser mru in state.cacheUsers.value) {
|
for (MeetingRoomUser mru in state.cacheUsers.value) {
|
||||||
if (mru.uid == meetingRoomUser.uid) {
|
if (mru.uid == meetingRoomUser.uid) {
|
||||||
mru.roleId = meetingRoomUser.roleId;
|
mru.roleId = meetingRoomUser.roleId;
|
||||||
|
if(state.defaulOpenState.value == 1){
|
||||||
mru.enableMicr = true;
|
mru.enableMicr = true;
|
||||||
|
}
|
||||||
mru.isRoomManager = meetingRoomUser.isRoomManager;
|
mru.isRoomManager = meetingRoomUser.isRoomManager;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (UserStore.to.userInfoEntity.value!.uid == meetingRoomUser.uid) {
|
if (UserStore.to.userInfoEntity.value!.uid == meetingRoomUser.uid) {
|
||||||
state.isSpeak.value = true;
|
state.isSpeak.value = true;
|
||||||
state.isOpenMicrophone.value = true;
|
debugPrint("wgs输出===:Socket-状态:${state.defaulOpenState.value}");
|
||||||
|
if (state.defaulOpenState.value == 1) {
|
||||||
|
debugPrint("wgs输出===:Socket-状态1111111111111");
|
||||||
|
doHttpSetMicr(true);
|
||||||
|
} else if (state.defaulOpenState.value == 2) {
|
||||||
|
debugPrint("wgs输出===:Socket-状态2222222222222");
|
||||||
|
doHttpSetCamer(true);
|
||||||
|
}
|
||||||
// 设置声网SDK角色为主播
|
// 设置声网SDK角色为主播
|
||||||
setClientRole("主播");
|
setClientRole("主播");
|
||||||
debugPrint("wgs输出===:Socket-开启发言权限:主播");
|
debugPrint("wgs输出===:Socket-开启发言权限:主播");
|
||||||
|
|
@ -338,16 +417,20 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
if (mru.uid == meetingRoomUser.uid) {
|
if (mru.uid == meetingRoomUser.uid) {
|
||||||
mru.roleId = meetingRoomUser.roleId;
|
mru.roleId = meetingRoomUser.roleId;
|
||||||
mru.enableMicr = false;
|
mru.enableMicr = false;
|
||||||
|
mru.enableCamera = false;
|
||||||
mru.isRoomManager = meetingRoomUser.isRoomManager;
|
mru.isRoomManager = meetingRoomUser.isRoomManager;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (UserStore.to.userInfoEntity.value!.uid == meetingRoomUser.uid) {
|
if (UserStore.to.userInfoEntity.value!.uid == meetingRoomUser.uid) {
|
||||||
state.isSpeak.value = false;
|
state.isSpeak.value = false;
|
||||||
|
state.defaulOpenState.value = 0;
|
||||||
state.isOpenMicrophone.value = false;
|
state.isOpenMicrophone.value = false;
|
||||||
state.isOpenCamera.value = false;
|
state.isOpenCamera.value = false;
|
||||||
state.isOpenShare.value = false;
|
state.isOpenShare.value = false;
|
||||||
state.remoteUid.value = "";
|
|
||||||
|
|
||||||
|
// 关闭麦克风视频
|
||||||
|
doHttpSetMicr(false);
|
||||||
|
doHttpSetCamer(false);
|
||||||
// 设置声网SDK角色为观众
|
// 设置声网SDK角色为观众
|
||||||
setClientRole("观众");
|
setClientRole("观众");
|
||||||
// 取消发布视频流
|
// 取消发布视频流
|
||||||
|
|
@ -356,14 +439,18 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
stopPreview();
|
stopPreview();
|
||||||
// 关闭本地预览悬浮窗
|
// 关闭本地预览悬浮窗
|
||||||
state.floating.value?.close();
|
state.floating.value?.close();
|
||||||
// 切换页面状态
|
// 当前全员观看主播是自己时
|
||||||
|
if (state.remoteUid.value == "0") {
|
||||||
|
state.remoteUid.value = "";
|
||||||
changePageState(0);
|
changePageState(0);
|
||||||
|
}
|
||||||
// 停止共享屏幕(此版本不做)
|
// 停止共享屏幕(此版本不做)
|
||||||
// stopScreenCapture();
|
// stopScreenCapture();
|
||||||
|
|
||||||
debugPrint("wgs输出===:Socket-关闭发言权限:观众");
|
debugPrint("wgs输出===:Socket-关闭发言权限:观众");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
update();
|
||||||
});
|
});
|
||||||
|
|
||||||
/// ------------------------------------------------------------------------------麦克风相关回调
|
/// ------------------------------------------------------------------------------麦克风相关回调
|
||||||
|
|
@ -379,6 +466,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
}
|
}
|
||||||
state.users.value = state.cacheUsers.value;
|
state.users.value = state.cacheUsers.value;
|
||||||
state.isOpenMicrophone.value = e?[0];
|
state.isOpenMicrophone.value = e?[0];
|
||||||
|
update();
|
||||||
});
|
});
|
||||||
|
|
||||||
/// 用户单独开闭麦回调
|
/// 用户单独开闭麦回调
|
||||||
|
|
@ -416,6 +504,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
muteLocalAudioStream(true);
|
muteLocalAudioStream(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
update();
|
||||||
});
|
});
|
||||||
|
|
||||||
/// ------------------------------------------------------------------------------会议室进出相关回调
|
/// ------------------------------------------------------------------------------会议室进出相关回调
|
||||||
|
|
@ -429,6 +518,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
.toList();
|
.toList();
|
||||||
state.cacheUsers.value.addAll(meetingRoomUsers);
|
state.cacheUsers.value.addAll(meetingRoomUsers);
|
||||||
state.users.value = state.cacheUsers.value;
|
state.users.value = state.cacheUsers.value;
|
||||||
|
update();
|
||||||
debugPrint("wgs输出===:Socket-远端用户或主播加入会议室:$jsonStr");
|
debugPrint("wgs输出===:Socket-远端用户或主播加入会议室:$jsonStr");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -445,6 +535,8 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state.users.value = state.cacheUsers.value;
|
state.users.value = state.cacheUsers.value;
|
||||||
|
update();
|
||||||
|
doHttpGetTvAnchor();
|
||||||
debugPrint("wgs输出===:Socket-远端用户或主播离开会议室:$jsonStr");
|
debugPrint("wgs输出===:Socket-远端用户或主播离开会议室:$jsonStr");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -453,15 +545,21 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
// var jsonStr = const Utf8Decoder().convert(json.encode(e).runes.toList());
|
// var jsonStr = const Utf8Decoder().convert(json.encode(e).runes.toList());
|
||||||
var jsonStr = json.encode(e);
|
var jsonStr = json.encode(e);
|
||||||
debugPrint("wgs输出===:Socket-被移除会议:$jsonStr");
|
debugPrint("wgs输出===:Socket-被移除会议:$jsonStr");
|
||||||
Get.back();
|
state.isNormaExit.value = true;
|
||||||
ToastUtils.showSuccess("你已被移除会议");
|
ToastUtils.showSuccess("你已被移除会议");
|
||||||
|
Future.delayed(const Duration(seconds: 1), () {
|
||||||
|
Get.back();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
/// 全员结束会议回调
|
/// 全员结束会议回调
|
||||||
state.hubConnection.value?.on("AllLeave", (e) {
|
state.hubConnection.value?.on("AllLeave", (e) {
|
||||||
debugPrint("wgs输出===:Socket-全员结束会议");
|
debugPrint("wgs输出===:Socket-全员结束会议");
|
||||||
Get.back();
|
state.isNormaExit.value = true;
|
||||||
ToastUtils.showSuccess("会议已结束");
|
ToastUtils.showSuccess("会议已结束");
|
||||||
|
Future.delayed(const Duration(seconds: 1), () {
|
||||||
|
Get.back();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
/// ------------------------------------------------------------------------------会议室聊天相关回调
|
/// ------------------------------------------------------------------------------会议室聊天相关回调
|
||||||
|
|
@ -470,8 +568,9 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
// var jsonStr = const Utf8Decoder().convert(json.encode(e).runes.toList());
|
// var jsonStr = const Utf8Decoder().convert(json.encode(e).runes.toList());
|
||||||
var jsonStr = json.encode(e);
|
var jsonStr = json.encode(e);
|
||||||
List list = json.decode(jsonStr);
|
List list = json.decode(jsonStr);
|
||||||
MeetingRoomMsg meetingRoomMsg =
|
DateTime dateTime = DateTime.now();
|
||||||
MeetingRoomMsg(list[0], list[1], list[2], 0);
|
MeetingRoomMsg meetingRoomMsg = MeetingRoomMsg(list[0], list[1], list[2],
|
||||||
|
0, formatDate(dateTime, [HH, ':', nn, ':', ss]));
|
||||||
state.meetingRoomMsgs.value.add(meetingRoomMsg);
|
state.meetingRoomMsgs.value.add(meetingRoomMsg);
|
||||||
update();
|
update();
|
||||||
Future.delayed(const Duration(milliseconds: 100), () {
|
Future.delayed(const Duration(milliseconds: 100), () {
|
||||||
|
|
@ -533,7 +632,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
stopPreview();
|
stopPreview();
|
||||||
// 当前全员观看主播是自己时
|
// 当前全员观看主播是自己时
|
||||||
if (state.remoteUid.value == "0") {
|
if (state.remoteUid.value == "0") {
|
||||||
changePageState(0);
|
state.remoteUid.value = "";
|
||||||
}
|
}
|
||||||
// 关闭本地预览悬浮窗
|
// 关闭本地预览悬浮窗
|
||||||
if (state.floating.value?.isShowing == true) {
|
if (state.floating.value?.isShowing == true) {
|
||||||
|
|
@ -541,6 +640,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
update();
|
||||||
});
|
});
|
||||||
|
|
||||||
/// 设置新的全员观看视频主播回调
|
/// 设置新的全员观看视频主播回调
|
||||||
|
|
@ -554,10 +654,17 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 加入会议室
|
/// 加入会议室
|
||||||
Future<void> joinMeetingToSocket() async {
|
/// isAgain:是否重新加入
|
||||||
|
Future<void> joinMeetingToSocket(bool isAgain) async {
|
||||||
await state.hubConnection.value?.invoke("joinChannel",
|
await state.hubConnection.value?.invoke("joinChannel",
|
||||||
args: [state.roomNumber.value, false, false, false]);
|
args: [state.roomNumber.value, false, false, false]);
|
||||||
mergeFetch();
|
mergeFetch(isAgain);
|
||||||
|
/*if(isAgain == false){
|
||||||
|
mergeFetch(isAgain);
|
||||||
|
initRtc(false);
|
||||||
|
}else{
|
||||||
|
mergeFetch(true);
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 离开会议室
|
/// 离开会议室
|
||||||
|
|
@ -569,11 +676,13 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
|
|
||||||
/// 会议室发送消息
|
/// 会议室发送消息
|
||||||
Future<void> sendMsg(String msg) async {
|
Future<void> sendMsg(String msg) async {
|
||||||
|
DateTime dateTime = DateTime.now();
|
||||||
MeetingRoomMsg meetingRoomMsg = MeetingRoomMsg(
|
MeetingRoomMsg meetingRoomMsg = MeetingRoomMsg(
|
||||||
UserStore.to.userInfoEntity.value!.uid,
|
UserStore.to.userInfoEntity.value!.uid,
|
||||||
UserStore.to.userInfoEntity.value!.userName,
|
UserStore.to.userInfoEntity.value!.userName,
|
||||||
msg,
|
msg,
|
||||||
1);
|
1,
|
||||||
|
formatDate(dateTime, [HH, ':', nn, ':', ss]));
|
||||||
state.meetingRoomMsgs.value.add(meetingRoomMsg);
|
state.meetingRoomMsgs.value.add(meetingRoomMsg);
|
||||||
update();
|
update();
|
||||||
Future.delayed(const Duration(milliseconds: 100), () {
|
Future.delayed(const Duration(milliseconds: 100), () {
|
||||||
|
|
@ -608,6 +717,9 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
// 打开用户音量回调
|
// 打开用户音量回调
|
||||||
await state.rctEngine.value?.enableAudioVolumeIndication(
|
await state.rctEngine.value?.enableAudioVolumeIndication(
|
||||||
interval: 200, smooth: 3, reportVad: true);
|
interval: 200, smooth: 3, reportVad: true);
|
||||||
|
// 在发送端设置双流模式并设置视频小流
|
||||||
|
await state.rctEngine.value
|
||||||
|
?.setDualStreamMode(mode: SimulcastStreamMode.enableSimulcastStream);
|
||||||
|
|
||||||
joinMeetingToRtc();
|
joinMeetingToRtc();
|
||||||
|
|
||||||
|
|
@ -616,6 +728,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
RtcEngineEventHandler(
|
RtcEngineEventHandler(
|
||||||
// 成功加入会议室回调
|
// 成功加入会议室回调
|
||||||
onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
|
onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
|
||||||
|
state.isJoinSuccess.value = true;
|
||||||
debugPrint("wgs输出===:RTC-自己加入会议室,ID:${connection.localUid}");
|
debugPrint("wgs输出===:RTC-自己加入会议室,ID:${connection.localUid}");
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -632,6 +745,16 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
// 远端用户或主播离开当前会议室回调-主播角色才能接收该回调
|
// 远端用户或主播离开当前会议室回调-主播角色才能接收该回调
|
||||||
onUserOffline: (RtcConnection connection, int remoteUid,
|
onUserOffline: (RtcConnection connection, int remoteUid,
|
||||||
UserOfflineReasonType reason) async {
|
UserOfflineReasonType reason) async {
|
||||||
|
// 判断是否用户取消了共享
|
||||||
|
if (remoteUid.toString().length == 9) {
|
||||||
|
for (var i = 0; i < state.cacheUsers.value.length; i++) {
|
||||||
|
if (remoteUid.toString() ==
|
||||||
|
state.cacheUsers.value[i].screenShareId) {
|
||||||
|
state.cacheUsers.value[i].enableShare = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update();
|
||||||
debugPrint("wgs输出===:RTC-远端用户或主播离开会议室,用户或主机的ID:$remoteUid");
|
debugPrint("wgs输出===:RTC-远端用户或主播离开会议室,用户或主机的ID:$remoteUid");
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -712,8 +835,10 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
},
|
},
|
||||||
|
|
||||||
// 切换用户角色回调
|
// 切换用户角色回调
|
||||||
onClientRoleChanged: (RtcConnection connection, ClientRoleType oldRole,
|
onClientRoleChanged: (RtcConnection connection,
|
||||||
ClientRoleType newRole, ClientRoleOptions newRoleOptions) {
|
ClientRoleType oldRole,
|
||||||
|
ClientRoleType newRole,
|
||||||
|
ClientRoleOptions newRoleOptions) {
|
||||||
debugPrint(
|
debugPrint(
|
||||||
"wgs输出===:RTC-切换用户角色为:${newRole == ClientRoleType.clientRoleBroadcaster ? "主播" : "观众"}");
|
"wgs输出===:RTC-切换用户角色为:${newRole == ClientRoleType.clientRoleBroadcaster ? "主播" : "观众"}");
|
||||||
},
|
},
|
||||||
|
|
@ -729,6 +854,47 @@ class MeetingMainLogic extends GetxController with RequestToolMixin {
|
||||||
debugPrint("wgs输出===:RTC-本地视频状态发生改变:$source--$state--$reason");
|
debugPrint("wgs输出===:RTC-本地视频状态发生改变:$source--$state--$reason");
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 网络连接状态回调
|
||||||
|
onConnectionStateChanged: (RtcConnection connection,
|
||||||
|
ConnectionStateType stateType,
|
||||||
|
ConnectionChangedReasonType reason) {
|
||||||
|
debugPrint("wgs输出===:RTC-网络连接状态发生改变:"
|
||||||
|
"会议室编号(${connection.channelId}),"
|
||||||
|
"网络状态($stateType-${AgoraUtil.getConnectionStateChangedType(stateType)}),"
|
||||||
|
"网络改变原因($reason-${AgoraUtil.getConnectionChangedReasonType(reason)})");
|
||||||
|
if (stateType == ConnectionStateType.connectionStateReconnecting) {
|
||||||
|
if (EasyLoading.isShow == false) {
|
||||||
|
ToastUtils.showLoadingToMask(
|
||||||
|
"网络故障,正在重连...", EasyLoadingMaskType.black);
|
||||||
|
}
|
||||||
|
} else if (stateType == ConnectionStateType.connectionStateConnected &&
|
||||||
|
reason ==
|
||||||
|
ConnectionChangedReasonType.connectionChangedRejoinSuccess) {
|
||||||
|
ToastUtils.dismiss();
|
||||||
|
if (EasyLoading.isShow == false) {
|
||||||
|
ToastUtils.showSuccessToMask("重连成功!", EasyLoadingMaskType.black);
|
||||||
|
}
|
||||||
|
} else if (reason ==
|
||||||
|
ConnectionChangedReasonType.connectionChangedLost) {
|
||||||
|
// 和服务器失去连接后,再延迟15秒(和signalR Socket一致),让SDK继续重连,如果重连不上则告知用户需要重新加入
|
||||||
|
Future.delayed(const Duration(milliseconds: 15000), () {
|
||||||
|
ToastUtils.dismiss();
|
||||||
|
if (state.isShowOkAlertDialog.value == false) {
|
||||||
|
showOkAlertDialog(
|
||||||
|
context: Get.context!,
|
||||||
|
title: "提示",
|
||||||
|
message: "网络错误,请重新加入会议室",
|
||||||
|
okLabel: "确定",
|
||||||
|
barrierDismissible: false,
|
||||||
|
).then((OkCancelResult value) {
|
||||||
|
Get.back();
|
||||||
|
Get.back();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 获取设备权限出错回调
|
// 获取设备权限出错回调
|
||||||
/*onPermissionError: (PermissionType permissionType){
|
/*onPermissionError: (PermissionType permissionType){
|
||||||
debugPrint("wgs输出===:RTC-获取设备权限出错:$permissionType");
|
debugPrint("wgs输出===:RTC-获取设备权限出错:$permissionType");
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,10 @@ class MeetingMainState {
|
||||||
|
|
||||||
/// 会议室信息
|
/// 会议室信息
|
||||||
late Rx<MeetingRoomInfo?> meetingRoomInfo = Rx(null);
|
late Rx<MeetingRoomInfo?> meetingRoomInfo = Rx(null);
|
||||||
|
/// 是否弹出showOkAlertDialog
|
||||||
|
late RxBool isShowOkAlertDialog = false.obs;
|
||||||
|
/// 是否正常退出(点击仅自己退出、全员结束、被移除)
|
||||||
|
late RxBool isNormaExit = false.obs;
|
||||||
|
|
||||||
/// 会议室计时相关
|
/// 会议室计时相关
|
||||||
late RxString duration = "".obs;
|
late RxString duration = "".obs;
|
||||||
|
|
@ -60,6 +64,8 @@ class MeetingMainState {
|
||||||
|
|
||||||
/// 是否被允许发言
|
/// 是否被允许发言
|
||||||
late RxBool isSpeak = false.obs;
|
late RxBool isSpeak = false.obs;
|
||||||
|
/// 允许发言后默认开启麦克风还是摄像头,0都关闭,1麦克风,2摄像头
|
||||||
|
late RxInt defaulOpenState = 0.obs;
|
||||||
/// 是否打开麦克风
|
/// 是否打开麦克风
|
||||||
late RxBool isOpenMicrophone = false.obs;
|
late RxBool isOpenMicrophone = false.obs;
|
||||||
/// 麦克风音量
|
/// 麦克风音量
|
||||||
|
|
@ -70,6 +76,8 @@ class MeetingMainState {
|
||||||
late RxBool isOpenShare = false.obs;
|
late RxBool isOpenShare = false.obs;
|
||||||
/// 当前视频主播ID
|
/// 当前视频主播ID
|
||||||
late RxString remoteUid = "".obs;
|
late RxString remoteUid = "".obs;
|
||||||
|
/// 是否成功加入会议室
|
||||||
|
late RxBool isJoinSuccess = false.obs;
|
||||||
|
|
||||||
/// 当前谁在说话
|
/// 当前谁在说话
|
||||||
late RxString spokesman = "".obs;
|
late RxString spokesman = "".obs;
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,14 @@ import 'dart:ui';
|
||||||
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
|
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:flutter_floating/floating/assist/floating_slide_type.dart';
|
import 'package:flutter_floating/floating/assist/floating_slide_type.dart';
|
||||||
import 'package:flutter_floating/floating/floating.dart';
|
import 'package:flutter_floating/floating/floating.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';
|
||||||
import 'package:liquid_progress_indicator_v2/liquid_progress_indicator.dart';
|
import 'package:liquid_progress_indicator_v2/liquid_progress_indicator.dart';
|
||||||
import 'package:preload_page_view/preload_page_view.dart';
|
import 'package:preload_page_view/preload_page_view.dart';
|
||||||
|
import 'package:wgshare/common/config/app_config.dart';
|
||||||
import 'package:wgshare/common/store/user_store.dart';
|
import 'package:wgshare/common/store/user_store.dart';
|
||||||
import 'package:wgshare/utils/toast_utils.dart';
|
import 'package:wgshare/utils/toast_utils.dart';
|
||||||
|
|
||||||
|
|
@ -46,7 +48,10 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
state.context.value = context;
|
state.context.value = context;
|
||||||
return Scaffold(
|
return PopScope(
|
||||||
|
canPop: false,
|
||||||
|
child: FlutterEasyLoading(
|
||||||
|
child: Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
surfaceTintColor: ColorUtil.Color_41_41_41,
|
surfaceTintColor: ColorUtil.Color_41_41_41,
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
|
|
@ -164,22 +169,6 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
/// 结束发言
|
|
||||||
Visibility(
|
|
||||||
visible: state.isSpeak.value,
|
|
||||||
child: GestureDetector(
|
|
||||||
child: Image.asset(
|
|
||||||
'assets/images/meeting_main_hang_up.png',
|
|
||||||
width: 22.w,
|
|
||||||
height: 22.h,
|
|
||||||
),
|
|
||||||
onTap: () {
|
|
||||||
logic.cancelSpeak();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(width: 16.w),
|
|
||||||
|
|
||||||
/// 退出会议
|
/// 退出会议
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
child: Image.asset(
|
child: Image.asset(
|
||||||
|
|
@ -214,7 +203,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
// 视频-共享
|
// 视频-共享
|
||||||
Visibility(
|
Visibility(
|
||||||
visible: state.pageState.value == 1,
|
visible: state.pageState.value == 1,
|
||||||
child: null != state.rctEngine.value
|
child: state.isJoinSuccess.value == true && null != state.rctEngine.value && null != state.users.value && state.users.value.isNotEmpty
|
||||||
? Stack(
|
? Stack(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
children: [
|
children: [
|
||||||
|
|
@ -286,14 +275,20 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
: Container()),
|
: Container(
|
||||||
|
color: ColorUtil.Color_0_0_0_0,
|
||||||
|
/*child: Text('加载反馈:是否成功加入会议室${state.isJoinSuccess.value}-会议室对象${state.rctEngine.value}-成员列表${state.users.value.length}-全员观看ID${state.remoteUid.value}'),*/
|
||||||
|
)),
|
||||||
|
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
child: Container(
|
child: Container(
|
||||||
width: 180.w,
|
width: 200.w,
|
||||||
height: 40.h,
|
height: 40.h,
|
||||||
margin:
|
margin: const EdgeInsets.only(
|
||||||
const EdgeInsets.only(left: 20, bottom: 40),
|
left: 20, bottom: 40),
|
||||||
padding: const EdgeInsets.only(left: 20),
|
padding: const EdgeInsets.only(left: 20),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: const BorderRadius.only(
|
borderRadius: const BorderRadius.only(
|
||||||
|
|
@ -306,7 +301,8 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
color: ColorUtil.Color_99_111_158),
|
color: ColorUtil.Color_99_111_158),
|
||||||
),
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.center,
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
|
|
@ -328,12 +324,41 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
Get.bottomSheet(
|
Get.bottomSheet(
|
||||||
isScrollControlled: true,
|
isScrollControlled: true,
|
||||||
chatBottomSheet(context));
|
chatBottomSheet(context));
|
||||||
Future.delayed(const Duration(milliseconds: 100),
|
Future.delayed(
|
||||||
() {
|
const Duration(milliseconds: 100), () {
|
||||||
state.chatController.jumpTo(state
|
state.chatController.jumpTo(state
|
||||||
.chatController.position.maxScrollExtent);
|
.chatController
|
||||||
|
.position
|
||||||
|
.maxScrollExtent);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
),
|
||||||
|
Visibility(
|
||||||
|
visible: state.isSpeak.value,
|
||||||
|
child: GestureDetector(
|
||||||
|
child: Container(
|
||||||
|
width: 82.w,
|
||||||
|
height: 40.h,
|
||||||
|
margin: const EdgeInsets.only(
|
||||||
|
left: 12, bottom: 40, right: 20),
|
||||||
|
alignment: Alignment.center,
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.all(
|
||||||
|
Radius.circular(99)),
|
||||||
|
color: ColorUtil.Color_255_69_69),
|
||||||
|
child: Text(
|
||||||
|
'结束发言',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.sp,
|
||||||
|
color: ColorUtil.Color_255_255_255),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
logic.cancelSpeak();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
@ -403,7 +428,8 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
if (state.isSpeak.value == false) {
|
if (state.isSpeak.value == false) {
|
||||||
Get.bottomSheet(
|
Get.bottomSheet(
|
||||||
isScrollControlled: true,
|
isScrollControlled: true,
|
||||||
applySpeakPermissionBottomSheet(context));
|
applySpeakPermissionBottomSheet(
|
||||||
|
context, 1));
|
||||||
} else {
|
} else {
|
||||||
if (state.isOpenMicrophone.value == false) {
|
if (state.isOpenMicrophone.value == false) {
|
||||||
logic.doHttpSetMicr(true);
|
logic.doHttpSetMicr(true);
|
||||||
|
|
@ -430,6 +456,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
),
|
),
|
||||||
SizedBox(height: 4.h),
|
SizedBox(height: 4.h),
|
||||||
Text(
|
Text(
|
||||||
|
/*state.isSpeak.value == false
|
||||||
|
? '申请发言'
|
||||||
|
: */
|
||||||
state.isOpenCamera.value == true
|
state.isOpenCamera.value == true
|
||||||
? "关闭视频"
|
? "关闭视频"
|
||||||
: "开启视频",
|
: "开启视频",
|
||||||
|
|
@ -440,7 +469,12 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (state.isSpeak.value == true) {
|
if (state.isSpeak.value == false) {
|
||||||
|
Get.bottomSheet(
|
||||||
|
isScrollControlled: true,
|
||||||
|
applySpeakPermissionBottomSheet(
|
||||||
|
context, 2));
|
||||||
|
} else {
|
||||||
if (state.isOpenCamera.value == true) {
|
if (state.isOpenCamera.value == true) {
|
||||||
logic.doHttpSetCamer(false);
|
logic.doHttpSetCamer(false);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -518,7 +552,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
meetingInfoFloatingLayer(),
|
meetingInfoFloatingLayer(),
|
||||||
meetingAudioFloatingLayer(),
|
meetingAudioFloatingLayer(),
|
||||||
],
|
],
|
||||||
)));
|
))),
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 退出会议底部弹窗
|
/// 退出会议底部弹窗
|
||||||
|
|
@ -546,6 +582,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
state.isNormaExit.value = true;
|
||||||
Get.back();
|
Get.back();
|
||||||
Get.back();
|
Get.back();
|
||||||
},
|
},
|
||||||
|
|
@ -742,8 +779,13 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
child: GestureDetector(
|
||||||
child: Container(
|
child: Container(
|
||||||
color: ColorUtil.Color_57_57_57_08,
|
color: ColorUtil.Color_57_57_57_08,
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
logic.changeMeetingInfoState(false);
|
||||||
|
},
|
||||||
))
|
))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
@ -757,8 +799,13 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
|
child: GestureDetector(
|
||||||
child: Container(
|
child: Container(
|
||||||
color: ColorUtil.Color_57_57_57_08,
|
color: ColorUtil.Color_57_57_57_08,
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
logic.changeMeetingAudioState(false);
|
||||||
|
},
|
||||||
)),
|
)),
|
||||||
Container(
|
Container(
|
||||||
color: ColorUtil.Color_57_57_57_08,
|
color: ColorUtil.Color_57_57_57_08,
|
||||||
|
|
@ -777,8 +824,13 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
child: GestureDetector(
|
||||||
child: Container(
|
child: Container(
|
||||||
color: ColorUtil.Color_57_57_57_08,
|
color: ColorUtil.Color_57_57_57_08,
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
logic.changeMeetingAudioState(false);
|
||||||
|
},
|
||||||
))
|
))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
@ -838,7 +890,8 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 申请发言权限底部弹窗
|
/// 申请发言权限底部弹窗
|
||||||
Widget applySpeakPermissionBottomSheet(BuildContext context) {
|
Widget applySpeakPermissionBottomSheet(
|
||||||
|
BuildContext context, int defaulOpenState) {
|
||||||
return Container(
|
return Container(
|
||||||
height: 240.h,
|
height: 240.h,
|
||||||
color: ColorUtil.Color_7_9_11,
|
color: ColorUtil.Color_7_9_11,
|
||||||
|
|
@ -936,6 +989,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
state.defaulOpenState.value = defaulOpenState;
|
||||||
logic.doHttpApplySpeak();
|
logic.doHttpApplySpeak();
|
||||||
Get.back();
|
Get.back();
|
||||||
},
|
},
|
||||||
|
|
@ -1033,13 +1087,15 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
Container(
|
Container(
|
||||||
margin:
|
margin:
|
||||||
const EdgeInsets.only(top: 18, left: 16, right: 16, bottom: 16),
|
const EdgeInsets.only(top: 18, left: 16, right: 16, bottom: 16),
|
||||||
child: Text(
|
child: GetBuilder<MeetingMainLogic>(builder: (controll) {
|
||||||
|
return Text(
|
||||||
'会议中(${state.users.value.length})',
|
'会议中(${state.users.value.length})',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14.sp,
|
fontSize: 14.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
color: ColorUtil.Color_85_117_242),
|
color: ColorUtil.Color_85_117_242),
|
||||||
),
|
);
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ScrollConfiguration(
|
child: ScrollConfiguration(
|
||||||
|
|
@ -1090,13 +1146,19 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
ColorUtil.Color_244_244_244),
|
ColorUtil.Color_244_244_244),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Container(
|
||||||
|
width: 76,
|
||||||
|
margin: const EdgeInsets.only(left: 6),
|
||||||
|
child: Text(
|
||||||
state.users.value[index].userName,
|
state.users.value[index].userName,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14.sp,
|
fontSize: 14.sp,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
color: ColorUtil.Color_243_243_243),
|
color: ColorUtil.Color_243_243_243),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
SizedBox(width: 8.w),
|
SizedBox(width: 8.w),
|
||||||
Visibility(
|
Visibility(
|
||||||
visible:
|
visible:
|
||||||
|
|
@ -1138,7 +1200,10 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
child: Image.asset(
|
child: Image.asset(
|
||||||
'assets/images/meeting_main_share_currently.png',
|
state.users.value[index].enableShare ==
|
||||||
|
true
|
||||||
|
? 'assets/images/meeting_main_share_currently.png'
|
||||||
|
: 'assets/images/meeting_main_share_currently_n.png',
|
||||||
width: 17.w,
|
width: 17.w,
|
||||||
height: 17.h,
|
height: 17.h,
|
||||||
),
|
),
|
||||||
|
|
@ -1322,10 +1387,23 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
margin: const EdgeInsets.only(left: 6),
|
margin: const EdgeInsets.only(left: 6),
|
||||||
child: Text(
|
child: Text.rich(
|
||||||
state.meetingRoomMsgs.value[index].userName,
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: state.meetingRoomMsgs.value[index].userName,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 10.sp, color: ColorUtil.Color_202_202_202),
|
fontSize: 12.sp, color: ColorUtil.Color_202_202_202),
|
||||||
|
),
|
||||||
|
TextSpan(
|
||||||
|
text: " ${state.meetingRoomMsgs.value[index].time}",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 10.sp, color: ColorUtil.Color_202_202_202
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
textAlign: TextAlign.left,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
|
|
@ -1334,9 +1412,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
left: 18, right: 18, top: 10, bottom: 10),
|
left: 18, right: 18, top: 10, bottom: 10),
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
borderRadius: BorderRadius.only(
|
borderRadius: BorderRadius.only(
|
||||||
bottomLeft: Radius.circular(99),
|
bottomLeft: Radius.circular(30),
|
||||||
topRight: Radius.circular(99),
|
topRight: Radius.circular(30),
|
||||||
bottomRight: Radius.circular(99)),
|
bottomRight: Radius.circular(30)),
|
||||||
color: ColorUtil.Color_53_53_53,
|
color: ColorUtil.Color_53_53_53,
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
|
|
@ -1368,10 +1446,23 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
margin: const EdgeInsets.only(right: 6),
|
margin: const EdgeInsets.only(right: 6),
|
||||||
child: Text(
|
child: Text.rich(
|
||||||
state.meetingRoomMsgs.value[index].userName,
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: "${state.meetingRoomMsgs.value[index].time} ",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 10.sp, color: ColorUtil.Color_202_202_202),
|
fontSize: 10.sp, color: ColorUtil.Color_202_202_202
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextSpan(
|
||||||
|
text: state.meetingRoomMsgs.value[index].userName,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12.sp, color: ColorUtil.Color_202_202_202),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
textAlign: TextAlign.right,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
|
|
@ -1380,9 +1471,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
left: 18, right: 18, top: 10, bottom: 10),
|
left: 18, right: 18, top: 10, bottom: 10),
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
borderRadius: BorderRadius.only(
|
borderRadius: BorderRadius.only(
|
||||||
topLeft: Radius.circular(99),
|
topLeft: Radius.circular(30),
|
||||||
bottomLeft: Radius.circular(99),
|
bottomLeft: Radius.circular(30),
|
||||||
bottomRight: Radius.circular(99)),
|
bottomRight: Radius.circular(30)),
|
||||||
color: ColorUtil.Color_85_117_242,
|
color: ColorUtil.Color_85_117_242,
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
|
|
@ -1470,7 +1561,8 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
var pageList = [];
|
var pageList = [];
|
||||||
|
|
||||||
/// 大屏
|
/// 大屏
|
||||||
pageList.add(Stack(
|
pageList.add(GetBuilder<MeetingMainLogic>(builder: (controll) {
|
||||||
|
return Stack(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
children: [
|
children: [
|
||||||
state.remoteUid.value != ""
|
state.remoteUid.value != ""
|
||||||
|
|
@ -1479,7 +1571,10 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
rtcEngine: state.rctEngine.value!,
|
rtcEngine: state.rctEngine.value!,
|
||||||
canvas: VideoCanvas(
|
canvas: VideoCanvas(
|
||||||
uid: int.tryParse(state.remoteUid.value),
|
uid: int.tryParse(state.remoteUid.value),
|
||||||
setupMode: VideoViewSetupMode.videoViewSetupAdd),
|
setupMode: VideoViewSetupMode.videoViewSetupAdd,
|
||||||
|
renderMode: state.remoteUid.value.length == 9
|
||||||
|
? RenderModeType.renderModeFit
|
||||||
|
: RenderModeType.renderModeHidden),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
: Container(
|
: Container(
|
||||||
|
|
@ -1539,10 +1634,12 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
));
|
);
|
||||||
|
}));
|
||||||
|
|
||||||
/// gridview
|
/// gridview
|
||||||
pageList.add(Container(
|
pageList.add(GetBuilder<MeetingMainLogic>(builder: (controll){
|
||||||
|
return Container(
|
||||||
color: ColorUtil.Color_57_57_57,
|
color: ColorUtil.Color_57_57_57,
|
||||||
child: GridView.builder(
|
child: GridView.builder(
|
||||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
|
|
@ -1552,8 +1649,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
state.cacheUsers.value[index].enableCamera == true
|
state.cacheUsers.value[index].enableCamera == true
|
||||||
? state.cacheUsers.value[index].uid ==
|
? state.cacheUsers.value[index].uid == UserStore.to.userInfoEntity.value!.uid
|
||||||
UserStore.to.userInfoEntity.value!.uid
|
|
||||||
? AgoraVideoView(
|
? AgoraVideoView(
|
||||||
controller: VideoViewController(
|
controller: VideoViewController(
|
||||||
rtcEngine: state.rctEngine.value!,
|
rtcEngine: state.rctEngine.value!,
|
||||||
|
|
@ -1639,12 +1735,17 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
shapePath:
|
shapePath:
|
||||||
ViewSvgPath.getMicrpphonePath()),
|
ViewSvgPath.getMicrpphonePath()),
|
||||||
),
|
),
|
||||||
Text(
|
SizedBox(
|
||||||
|
width: 70,
|
||||||
|
child: Text(
|
||||||
state.cacheUsers.value[index].userName,
|
state.cacheUsers.value[index].userName,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 12.sp,
|
fontSize: 12.sp,
|
||||||
color: ColorUtil.Color_255_255_255),
|
color: ColorUtil.Color_255_255_255),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
: Row(
|
: Row(
|
||||||
|
|
@ -1656,12 +1757,17 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
width: 20.w,
|
width: 20.w,
|
||||||
height: 20.h,
|
height: 20.h,
|
||||||
),
|
),
|
||||||
Text(
|
SizedBox(
|
||||||
|
width: 70,
|
||||||
|
child: Text(
|
||||||
state.cacheUsers.value[index].userName,
|
state.cacheUsers.value[index].userName,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 12.sp,
|
fontSize: 12.sp,
|
||||||
color: ColorUtil.Color_255_255_255),
|
color: ColorUtil.Color_255_255_255),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -1671,7 +1777,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
));
|
);
|
||||||
|
}));
|
||||||
|
|
||||||
return pageList[position];
|
return pageList[position];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,11 +72,16 @@ class MeetingMainVoiceComponent extends StatelessWidget {
|
||||||
shapePath: ViewSvgPath.getMicrpphonePath()
|
shapePath: ViewSvgPath.getMicrpphonePath()
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
SizedBox(
|
||||||
|
width: 70,
|
||||||
|
child: Text(
|
||||||
users[index].userName,
|
users[index].userName,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 12.sp,
|
fontSize: 12.sp,
|
||||||
color: ColorUtil.Color_255_255_255),
|
color: ColorUtil.Color_255_255_255),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
@ -89,11 +94,16 @@ class MeetingMainVoiceComponent extends StatelessWidget {
|
||||||
width: 20.w,
|
width: 20.w,
|
||||||
height: 20.h,
|
height: 20.h,
|
||||||
),
|
),
|
||||||
Text(
|
SizedBox(
|
||||||
|
width: 70,
|
||||||
|
child: Text(
|
||||||
users[index].userName,
|
users[index].userName,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 12.sp,
|
fontSize: 12.sp,
|
||||||
color: ColorUtil.Color_255_255_255),
|
color: ColorUtil.Color_255_255_255),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,6 @@ class UserLogic extends GetxController with RequestToolMixin {
|
||||||
/// 退出登录
|
/// 退出登录
|
||||||
void logout(){
|
void logout(){
|
||||||
UserStore.to.erase();
|
UserStore.to.erase();
|
||||||
Get.offAllNamed(Routes.loginPage);
|
Get.toNamed(Routes.loginPage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ class UserPageState extends State<UserPage> {
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: Text(
|
child: Text(
|
||||||
UserStore.to.userInfoEntity.value!.userName.length >= 3
|
UserStore.to.userInfoEntity.value!.userName.length >= 3
|
||||||
? UserStore.to.userInfoEntity.value!.userName.substring(1,UserStore.to.userInfoEntity.value!.userName.length)
|
? UserStore.to.userInfoEntity.value!.userName.substring(UserStore.to.userInfoEntity.value!.userName.length - 2,UserStore.to.userInfoEntity.value!.userName.length)
|
||||||
: UserStore.to.userInfoEntity.value!.userName,
|
: UserStore.to.userInfoEntity.value!.userName,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 30.sp,
|
fontSize: 30.sp,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
|
||||||
|
|
||||||
|
/// 声网SDK相关工具类
|
||||||
|
class AgoraUtil{
|
||||||
|
/// 获取网络连接状态
|
||||||
|
static String getConnectionStateChangedType(ConnectionStateType type){
|
||||||
|
var returnTypeStr = "";
|
||||||
|
switch(type){
|
||||||
|
case ConnectionStateType.connectionStateDisconnected:
|
||||||
|
returnTypeStr = "网络连接断开";
|
||||||
|
break;
|
||||||
|
case ConnectionStateType.connectionStateConnecting:
|
||||||
|
returnTypeStr = "网络连接中";
|
||||||
|
break;
|
||||||
|
case ConnectionStateType.connectionStateConnected:
|
||||||
|
returnTypeStr = "网络已连接";
|
||||||
|
break;
|
||||||
|
case ConnectionStateType.connectionStateReconnecting:
|
||||||
|
returnTypeStr = "网络重新连接中";
|
||||||
|
break;
|
||||||
|
case ConnectionStateType.connectionStateFailed:
|
||||||
|
returnTypeStr = "网络连接失败";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return returnTypeStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 获取网络连接状态发生变化的原因
|
||||||
|
static String getConnectionChangedReasonType(ConnectionChangedReasonType type){
|
||||||
|
var returnTypeStr = "";
|
||||||
|
switch(type){
|
||||||
|
case ConnectionChangedReasonType.connectionChangedConnecting:
|
||||||
|
returnTypeStr = "建立网络连接中";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedJoinSuccess:
|
||||||
|
returnTypeStr = "成功加入频道";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedInterrupted:
|
||||||
|
returnTypeStr = "网络连接中断";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedBannedByServer:
|
||||||
|
returnTypeStr = "网络连接被服务器禁止";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedJoinFailed:
|
||||||
|
returnTypeStr = "加入频道失败";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedLeaveChannel:
|
||||||
|
returnTypeStr = "离开频道";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedInvalidAppId:
|
||||||
|
returnTypeStr = "App ID 无效";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedInvalidChannelName:
|
||||||
|
returnTypeStr = "频道名无效";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedInvalidToken:
|
||||||
|
returnTypeStr = "Token 无效";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedTokenExpired:
|
||||||
|
returnTypeStr = "当前使用的 Token 已过期";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedRejectedByServer:
|
||||||
|
returnTypeStr = "此用户被服务器禁止";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedSettingProxyServer:
|
||||||
|
returnTypeStr = "设置了代理服务器";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedRenewToken:
|
||||||
|
returnTypeStr = "更新 Token 引起网络连接状态改变";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedClientIpAddressChanged:
|
||||||
|
returnTypeStr = "客户端 IP 地址变更";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedKeepAliveTimeout:
|
||||||
|
returnTypeStr = "SDK 和服务器连接保活超时";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedRejoinSuccess:
|
||||||
|
returnTypeStr = "重新加入频道成功";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedLost:
|
||||||
|
returnTypeStr = "SDK 和服务器失去连接";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedEchoTest:
|
||||||
|
returnTypeStr = "连接状态变化由回声测试引起";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedClientIpAddressChangedByUser:
|
||||||
|
returnTypeStr = "本地 IP 地址被用户更改";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedSameUidLogin:
|
||||||
|
returnTypeStr = "使用相同的 UID 从不同的设备加入同一频道";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedTooManyBroadcasters:
|
||||||
|
returnTypeStr = "频道内主播人数已达上限";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedLicenseValidationFailure:
|
||||||
|
returnTypeStr = "连接已更改许可证验证失败";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedCertificationVeryfyFailure:
|
||||||
|
returnTypeStr = "连接已更改认证版本失败";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedStreamChannelNotAvailable:
|
||||||
|
returnTypeStr = "连接已更改流通道不可用";
|
||||||
|
break;
|
||||||
|
case ConnectionChangedReasonType.connectionChangedInconsistentAppid:
|
||||||
|
returnTypeStr = "连接已更改不一致Appid";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return returnTypeStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -71,6 +71,8 @@ class ColorUtil {
|
||||||
|
|
||||||
static const Color_16_19_13 = Color.fromRGBO(16, 19, 13, 1);
|
static const Color_16_19_13 = Color.fromRGBO(16, 19, 13, 1);
|
||||||
|
|
||||||
|
static const Color_255_69_69 = Color.fromRGBO(255, 69, 69, 1);
|
||||||
|
|
||||||
/// 十六进制颜色,
|
/// 十六进制颜色,
|
||||||
/// hex, 十六进制值,例如:0xffffff,
|
/// hex, 十六进制值,例如:0xffffff,
|
||||||
/// alpha, 透明度 [0.0,1.0]
|
/// alpha, 透明度 [0.0,1.0]
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,10 @@ class ToastUtils {
|
||||||
EasyLoading.showError(showMsg, duration: duration);
|
EasyLoading.showError(showMsg, duration: duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static showLoadingToMask(String str, EasyLoadingMaskType maskType) {
|
||||||
|
EasyLoading.show(status: str, maskType: maskType);
|
||||||
|
}
|
||||||
|
|
||||||
static showLoading() {
|
static showLoading() {
|
||||||
EasyLoading.show(status: 'loading...');
|
EasyLoading.show(status: 'loading...');
|
||||||
}
|
}
|
||||||
|
|
@ -63,6 +67,10 @@ class ToastUtils {
|
||||||
EasyLoading.showInfo(showMsg, duration: Duration(microseconds: microseconds));
|
EasyLoading.showInfo(showMsg, duration: Duration(microseconds: microseconds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static showSuccessToMask(String showMsg, EasyLoadingMaskType maskType, {Duration? duration}) {
|
||||||
|
EasyLoading.showSuccess(showMsg, maskType: maskType, duration: duration);
|
||||||
|
}
|
||||||
|
|
||||||
static showSuccess(String showMsg, {Duration? duration}) {
|
static showSuccess(String showMsg, {Duration? duration}) {
|
||||||
EasyLoading.showSuccess(showMsg, duration: duration);
|
EasyLoading.showSuccess(showMsg, duration: duration);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,10 @@
|
||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <dynamic_color/dynamic_color_plugin.h>
|
||||||
|
|
||||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||||
|
g_autoptr(FlPluginRegistrar) dynamic_color_registrar =
|
||||||
|
fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin");
|
||||||
|
dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
dynamic_color
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
|
|
|
||||||
|
|
@ -6,20 +6,28 @@ import FlutterMacOS
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
import agora_rtc_engine
|
import agora_rtc_engine
|
||||||
|
import appkit_ui_element_colors
|
||||||
import device_info_plus
|
import device_info_plus
|
||||||
|
import dynamic_color
|
||||||
import flutter_inappwebview_macos
|
import flutter_inappwebview_macos
|
||||||
import geolocator_apple
|
import geolocator_apple
|
||||||
import iris_method_channel
|
import iris_method_channel
|
||||||
|
import macos_ui
|
||||||
|
import macos_window_utils
|
||||||
import package_info_plus
|
import package_info_plus
|
||||||
import path_provider_foundation
|
import path_provider_foundation
|
||||||
import sqflite_darwin
|
import sqflite_darwin
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
AgoraRtcNgPlugin.register(with: registry.registrar(forPlugin: "AgoraRtcNgPlugin"))
|
AgoraRtcNgPlugin.register(with: registry.registrar(forPlugin: "AgoraRtcNgPlugin"))
|
||||||
|
AppkitUiElementColorsPlugin.register(with: registry.registrar(forPlugin: "AppkitUiElementColorsPlugin"))
|
||||||
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||||
|
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
|
||||||
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
|
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
|
||||||
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
|
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
|
||||||
IrisMethodChannelPlugin.register(with: registry.registrar(forPlugin: "IrisMethodChannelPlugin"))
|
IrisMethodChannelPlugin.register(with: registry.registrar(forPlugin: "IrisMethodChannelPlugin"))
|
||||||
|
MacOSUiPlugin.register(with: registry.registrar(forPlugin: "MacOSUiPlugin"))
|
||||||
|
MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin"))
|
||||||
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,14 @@ packages:
|
||||||
description: dart
|
description: dart
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.3.2"
|
version: "0.3.2"
|
||||||
|
adaptive_dialog:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: adaptive_dialog
|
||||||
|
sha256: a87f9e13fdbe0b11d353733a90796129ee79fc0654a27855fa2c9c0a3633a362
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "2.3.0"
|
||||||
agora_rtc_engine:
|
agora_rtc_engine:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -30,6 +38,22 @@ packages:
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.7.0"
|
version: "6.7.0"
|
||||||
|
animations:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: animations
|
||||||
|
sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.11"
|
||||||
|
appkit_ui_element_colors:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: appkit_ui_element_colors
|
||||||
|
sha256: c3e50f900aae314d339de489535736238627071457c4a4a2dbbb1545b4f04f22
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -214,6 +238,14 @@ packages:
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.7"
|
version: "2.3.7"
|
||||||
|
date_format:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: date_format
|
||||||
|
sha256: a48254e60bdb7f1d5a15cac7f86e37491808056c0a99dbdc850841def4754ddc
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.9"
|
||||||
device_info_plus:
|
device_info_plus:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -246,6 +278,14 @@ packages:
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
|
dynamic_color:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: dynamic_color
|
||||||
|
sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "1.7.0"
|
||||||
easy_debounce:
|
easy_debounce:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -546,6 +586,14 @@ packages:
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.2"
|
||||||
|
gradient_borders:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: gradient_borders
|
||||||
|
sha256: b1cd969552c83f458ff755aa68e13a0327d09f06c3f42f471b423b01427f21f8
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.1"
|
||||||
graphs:
|
graphs:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -586,6 +634,14 @@ packages:
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.0.2"
|
||||||
|
intersperse:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: intersperse
|
||||||
|
sha256: "2f8a905c96f6cbba978644a3d5b31b8d86ddc44917662df7d27a61f3df66a576"
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
intl:
|
intl:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -690,6 +746,22 @@ packages:
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.3.0"
|
||||||
|
macos_ui:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: macos_ui
|
||||||
|
sha256: "80f6539aba5a3a1182d5225a6c27969a780bcb1d2d8135b4ffb708570cf0c854"
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.9"
|
||||||
|
macos_window_utils:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: macos_window_utils
|
||||||
|
sha256: "3534f2af024f2f24112ca28789a44e6750083f8c0065414546c6593ee48a5009"
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "1.6.1"
|
||||||
macros:
|
macros:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,6 @@ dependencies:
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# The following adds the Cupertino Icons font to your application.
|
# The following adds the Cupertino Icons font to your application.
|
||||||
# Use with the CupertinoIcons class for iOS style icons.
|
# Use with the CupertinoIcons class for iOS style icons.
|
||||||
cupertino_icons: ^1.0.8
|
cupertino_icons: ^1.0.8
|
||||||
|
|
@ -86,9 +84,14 @@ dependencies:
|
||||||
preload_page_view: ^0.2.0
|
preload_page_view: ^0.2.0
|
||||||
|
|
||||||
# webview
|
# webview
|
||||||
#webview_flutter: ^3.0.4
|
|
||||||
flutter_inappwebview: ^6.1.5
|
flutter_inappwebview: ^6.1.5
|
||||||
|
|
||||||
|
# 时间组件
|
||||||
|
date_format: ^2.0.9
|
||||||
|
|
||||||
|
# 弹窗
|
||||||
|
adaptive_dialog: ^2.3.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <agora_rtc_engine/agora_rtc_engine_plugin.h>
|
#include <agora_rtc_engine/agora_rtc_engine_plugin.h>
|
||||||
|
#include <dynamic_color/dynamic_color_plugin_c_api.h>
|
||||||
#include <flutter_inappwebview_windows/flutter_inappwebview_windows_plugin_c_api.h>
|
#include <flutter_inappwebview_windows/flutter_inappwebview_windows_plugin_c_api.h>
|
||||||
#include <geolocator_windows/geolocator_windows.h>
|
#include <geolocator_windows/geolocator_windows.h>
|
||||||
#include <iris_method_channel/iris_method_channel_plugin_c_api.h>
|
#include <iris_method_channel/iris_method_channel_plugin_c_api.h>
|
||||||
|
|
@ -15,6 +16,8 @@
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
AgoraRtcEnginePluginRegisterWithRegistrar(
|
AgoraRtcEnginePluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("AgoraRtcEnginePlugin"));
|
registry->GetRegistrarForPlugin("AgoraRtcEnginePlugin"));
|
||||||
|
DynamicColorPluginCApiRegisterWithRegistrar(
|
||||||
|
registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
|
||||||
FlutterInappwebviewWindowsPluginCApiRegisterWithRegistrar(
|
FlutterInappwebviewWindowsPluginCApiRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("FlutterInappwebviewWindowsPluginCApi"));
|
registry->GetRegistrarForPlugin("FlutterInappwebviewWindowsPluginCApi"));
|
||||||
GeolocatorWindowsRegisterWithRegistrar(
|
GeolocatorWindowsRegisterWithRegistrar(
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
agora_rtc_engine
|
agora_rtc_engine
|
||||||
|
dynamic_color
|
||||||
flutter_inappwebview_windows
|
flutter_inappwebview_windows
|
||||||
geolocator_windows
|
geolocator_windows
|
||||||
iris_method_channel
|
iris_method_channel
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue