Merge branch 'dev'

# Conflicts:
#	wgshare/ios/Podfile
#	wgshare/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
#	wgshare/ios/Runner/Info.plist
#	wgshare/lib/pages/loginPage/agreement/agreement_read_view.dart
#	wgshare/pubspec.lock
This commit is contained in:
fuenmao 2024-12-13 17:31:12 +08:00
commit bb41882757
33 changed files with 890 additions and 1121 deletions

3
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/wgshare/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/wgshare/.pub" />
<excludeFolder url="file://$MODULE_DIR$/wgshare/build" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/misc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/WGShare.Mobile.Flutter.iml" filepath="$PROJECT_DIR$/.idea/WGShare.Mobile.Flutter.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@ -39,65 +39,6 @@ end
post_install do |installer|
installer.pods_project.targets.each do |target|
# Here are some configurations automatically generated by flutter
# Start of the permission_handler configuration
target.build_configurations.each do |config|
# You can enable the permissions needed here. For example to enable camera
# permission, just remove the `#` character in front so it looks like this:
#
# ## dart: PermissionGroup.camera
# 'PERMISSION_CAMERA=1'
#
# Preprocessor definitions can be found in: https://github.com/Baseflow/flutter-permission-handler/blob/master/permission_handler_apple/ios/Classes/PermissionHandlerEnums.h
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: PermissionGroup.calendar
# 'PERMISSION_EVENTS=1',
## dart: PermissionGroup.reminders
# 'PERMISSION_REMINDERS=1',
## dart: PermissionGroup.contacts
# 'PERMISSION_CONTACTS=1',
## dart: PermissionGroup.camera
'PERMISSION_CAMERA=1',
## dart: PermissionGroup.microphone
'PERMISSION_MICROPHONE=1',
## dart: PermissionGroup.speech
# 'PERMISSION_SPEECH_RECOGNIZER=1',
## dart: PermissionGroup.photos
# 'PERMISSION_PHOTOS=1',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
# 'PERMISSION_LOCATION=1',
## dart: PermissionGroup.notification
# 'PERMISSION_NOTIFICATIONS=1',
## dart: PermissionGroup.mediaLibrary
# 'PERMISSION_MEDIA_LIBRARY=1',
## dart: PermissionGroup.sensors
# 'PERMISSION_SENSORS=1',
## dart: PermissionGroup.bluetooth
# 'PERMISSION_BLUETOOTH=1',
## dart: PermissionGroup.appTrackingTransparency
# 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
## dart: PermissionGroup.criticalAlerts
# 'PERMISSION_CRITICAL_ALERTS=1'
]
end
# End of the permission_handler configuration
flutter_additional_ios_build_settings(target)
end
end

View File

@ -1,121 +1,120 @@
{
"images" : [
{
"filename" : "40.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "60.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"filename" : "29.png",
"idiom" : "iphone",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "58.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "87.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"filename" : "80.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "120.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"filename" : "120 1.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "180.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"filename" : "20.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"filename" : "40 1.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "29 1.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "58 1.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "40 2.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "76.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"filename" : "152.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"filename" : "167.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"filename" : "1024.png",
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
"images": [
{
"size": "20x20",
"idiom": "universal",
"filename": "icon-20@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "20x20",
"idiom": "universal",
"filename": "icon-20@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "29x29",
"idiom": "universal",
"filename": "icon-29@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "29x29",
"idiom": "universal",
"filename": "icon-29@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "38x38",
"idiom": "universal",
"filename": "icon-38@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "38x38",
"idiom": "universal",
"filename": "icon-38@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "40x40",
"idiom": "universal",
"filename": "icon-40@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "40x40",
"idiom": "universal",
"filename": "icon-40@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "60x60",
"idiom": "universal",
"filename": "icon-60@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "60x60",
"idiom": "universal",
"filename": "icon-60@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "64x64",
"idiom": "universal",
"filename": "icon-64@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "64x64",
"idiom": "universal",
"filename": "icon-64@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "68x68",
"idiom": "universal",
"filename": "icon-68@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "76x76",
"idiom": "universal",
"filename": "icon-76@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "83.5x83.5",
"idiom": "universal",
"filename": "icon-83.5@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "1024x1024",
"idiom": "universal",
"filename": "icon-1024.png",
"scale": "1x",
"platform": "ios"
}
],
"info": {
"version": 1,
"author": "icon.wuruihong.com"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -8,10 +8,6 @@
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>智汇享</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict/>
</array>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@ -41,7 +37,7 @@
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiresFullScreen</key>
<false/>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>

View File

@ -2,9 +2,9 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'agreement_read_logic.dart';
import 'agreement_read_state.dart';
@ -23,7 +23,6 @@ class AgreementReadPageState extends State<AgreementReadPage> {
@override
void initState() {
super.initState();
if (Platform.isAndroid) WebView.platform = AndroidWebView();
}
@override
@ -81,12 +80,15 @@ class AgreementReadPageState extends State<AgreementReadPage> {
),
///
const Expanded(
child: WebView(
initialUrl:
'https://static.23544.com/WGShare-PrivacyPolicy.html',
),
),
Expanded(
child: InAppWebView(
initialUrlRequest:
URLRequest(url: WebUri("https://static.23544.com/WGShare-PrivacyPolicy.html")),
initialSettings: InAppWebViewSettings(
transparentBackground: true,
safeBrowsingEnabled: true,
isFraudulentWebsiteWarningEnabled: true),
)),
],
));
}

View File

@ -17,7 +17,7 @@ import '../../utils/permission/PermissionService.dart';
import '../../utils/toast_utils.dart';
import 'meeting_main_state.dart';
class MeetingMainLogic extends GetxController with RequestToolMixin{
class MeetingMainLogic extends GetxController with RequestToolMixin {
final MeetingMainState state = MeetingMainState();
@override
@ -45,10 +45,11 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
/// Token
Future<void> doHttpGetMeetingToken(bool isInit) async {
BaseStructureResult<String> res = await getClient().getMeetingToken(state.roomNumber.value);
BaseStructureResult<String> res =
await getClient().getMeetingToken(state.roomNumber.value);
state.meetingToken.value = res.data!;
if(isInit == true){
if (isInit == true) {
initRtc();
signalRSocket();
}
@ -58,32 +59,33 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
/// 1.
/// 2.
Future<void> mergeFetch() async {
try{
try {
ToastUtils.showLoading();
var results = await Future.wait([
getClient().getMeetingRoomInfo(state.roomNumber.value),
getClient().getMeetingRoomAllUser(state.roomNumber.value)]);
getClient().getMeetingRoomAllUser(state.roomNumber.value)
]);
getMeetingRoomInfo(results[0].data as MeetingRoomInfo);
getMeetingRoomAllUser(results[1].data as List<MeetingRoomUser>);
}finally{
} finally {
ToastUtils.dismiss();
}
}
///
void changeMeetingInfoState(bool isShow){
void changeMeetingInfoState(bool isShow) {
state.isShowMeetingInfoFloatingLayer.value = isShow;
}
///
void changeMeetingAudioState(bool isShow){
void changeMeetingAudioState(bool isShow) {
state.isShowMeetingAudioFloatingLayer.value = isShow;
}
///
void changePageState(int pageState){
void changePageState(int pageState) {
state.pageState.value = pageState;
}
@ -101,16 +103,17 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
}
///
void startTime(){
void startTime() {
state.stopwatch.value.start();
state.timer.value = Timer.periodic(const Duration(milliseconds: 100), upTime);
state.timer.value =
Timer.periodic(const Duration(milliseconds: 100), upTime);
}
///
void upTime(Timer t) {
if(state.stopwatch.value.isRunning){
if (state.stopwatch.value.isRunning) {
state.duration.value =
"${state.stopwatch.value.elapsed.inHours.toString().padLeft(2, "0")}"
"${state.stopwatch.value.elapsed.inHours.toString().padLeft(2, "0")}"
":${(state.stopwatch.value.elapsed.inMinutes % 60).toString().padLeft(2, "0")}"
":${(state.stopwatch.value.elapsed.inSeconds % 60).toString().padLeft(2, "0")}";
}
@ -123,16 +126,16 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
}
///
void searchMember(String value){
if(value.isNotEmpty){
void searchMember(String value) {
if (value.isNotEmpty) {
List<MeetingRoomUser> memberSearchList = [];
for(var i = 0; i < state.cacheUsers.value.length; i++){
if(state.cacheUsers.value[i].userName.contains(value)){
for (var i = 0; i < state.cacheUsers.value.length; i++) {
if (state.cacheUsers.value[i].userName.contains(value)) {
memberSearchList.add(state.cacheUsers.value[i]);
}
}
state.users.value = memberSearchList;
}else{
} else {
state.users.value = state.cacheUsers.value;
}
}
@ -145,128 +148,106 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
///
Future<void> doHttpCancelSpeak() async {
await getClient().cancelSpeak(state.meetingRoomInfo.value!.id, state.meetingRoomInfo.value!.roomNum, UserStore.to.userInfoEntity.value!.uid);
await getClient().cancelSpeak(
state.meetingRoomInfo.value!.id,
state.meetingRoomInfo.value!.roomNum,
UserStore.to.userInfoEntity.value!.uid);
}
///
Future<void> cancelSpeak() async {
try {
ToastUtils.showLoading();
await Future.wait(
[doHttpCancelSpeak(), doHttpSetMicr(false), doHttpSetCamer(false)]);
} finally {
ToastUtils.dismiss();
}
}
/// ------------------------------------------------------------------------------
///
Future<void> doHttpSetMicr(bool isOpenMicrophone) async {
await getClient().setMicr(state.roomNumber.value, isOpenMicrophone, UserStore.to.userInfoEntity.value!.uid);
await getClient().setMicr(state.roomNumber.value, isOpenMicrophone,
UserStore.to.userInfoEntity.value!.uid);
}
/// -------------------------------------------------------------------------------
///
Future<void> doHttpSetCamer(bool isOpenCamera) async {
await getClient().setCamera(state.roomNumber.value, isOpenCamera, UserStore.to.userInfoEntity.value!.uid);
await getClient().setCamera(state.roomNumber.value, isOpenCamera,
UserStore.to.userInfoEntity.value!.uid);
}
///
void setCameraOpen(bool isOpen){
void setCameraOpen(bool isOpen) {
state.isOpenCamera.value = isOpen;
}
///
Future<void> doHttpGetTvAnchor() async {
BaseStructureResult res = await getClient().getTvAnchor(state.roomNumber.value);
BaseStructureResult res =
await getClient().getTvAnchor(state.roomNumber.value);
state.remoteUid.value = res.data!.toString();
debugPrint("wgs输出===:获取当前全员观看主播${res.data}");
if(res.data!.toString().length != 9){
if (res.data!.toString().length != 9) {
//
//
if(state.remoteUid.value == UserStore.to.userInfoEntity.value!.uid) {
state.isSelf.value = true;
}else{
state.isSelf.value = false;
}
if(state.isSelf.value == true){
//
if(state.isOpenCamera.value == true){
//
changePageState(1);
state.floating.value?.close();
}else{
//
changePageState(0);
}
}else{
//
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){
isCurrentUserIsCamera = true;
}
}
if(isCurrentUserIsCamera == true){
changePageState(1);
}else{
changePageState(0);
}
}
}else{
//
//
if(state.remoteUid.value != UserStore.to.userInfoEntity.value!.screenShareId){
state.isSelf.value = false;
}else{
state.isSelf.value = true;
}
//
if(state.isSelf.value == false){
changePageState(1);
}
}
/*if(res.data!.toString().length != 9){
if(state.remoteUid.value != UserStore.to.userInfoEntity.value!.uid) {
state.isSelf.value = false;
}else{
state.isSelf.value = true;
}
if(state.isSelf.value == true){
if(state.isOpenCamera.value == true){
changePageState(1);
}else{
changePageState(0);
}
if (state.remoteUid.value == UserStore.to.userInfoEntity.value!.uid) {
//
// ID为0
state.remoteUid.value = "0";
//
state.floating.value?.close();
}else{
if (state.isSpeak.value == true && state.isOpenCamera.value == true) {
//
changePageState(1);
} else {
//
changePageState(0);
}
} else {
//
//
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){
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) {
isCurrentUserIsCamera = true;
}
}
if(isCurrentUserIsCamera == true){
if (isCurrentUserIsCamera == true) {
//
debugPrint("wgs输出===:当前会议室存在全员观看主播时,切换页面到视频状态");
changePageState(1);
} else {
// ID为空并切换页面到视频状态
debugPrint("wgs输出===当前会议室不存在全员观看主播时设置主播ID为空并切换页面到视频状态");
state.remoteUid.value = "";
changePageState(1);
}else{
changePageState(0);
}
}
}else{
if(state.remoteUid.value != UserStore.to.userInfoEntity.value!.screenShareId){
state.isSelf.value = false;
} else {
//
/*if(state.remoteUid.value == UserStore.to.userInfoEntity.value!.screenShareId){
//
}else{
state.isSelf.value = true;
}
if(state.isSelf.value == false){
//
changePageState(1);
}
}*/
}*/
}
}
///
Future<void> doHttpSetTvAnchor(String id) async {
await getClient().setTvAnchor(
state.roomNumber.value,
id,
UserStore.to.userInfoEntity.value!.userName
);
await getClient().setTvAnchor(state.roomNumber.value, id,
UserStore.to.userInfoEntity.value!.userName);
}
///
///
/*Future<void> startScreenCapture() async {
debugPrint("wgs输出===RTC-启动屏幕共享");
state.isOpenShare.value = true;
@ -290,7 +271,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
doHttpSetTvAnchor(UserStore.to.userInfoEntity.value!.screenShareId);
}*/
///
///
/*Future<void> stopScreenCapture() async {
debugPrint("wgs输出===RTC-停止屏幕共享");
state.isOpenShare.value = false;
@ -308,16 +289,19 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
doHttpSetTvAnchor(UserStore.to.userInfoEntity.value!.uid);
}*/
/// ------------------------------------------------------------------------------signalR Socket相关
/// Socket长连接
Future<void> signalRSocket() async {
state.hubConnection.value = HubConnectionBuilder()
.withUrl('${RequestConfig().baseUrl}/session-manage', HttpConnectionOptions(
transport: HttpTransportType.webSockets,
accessTokenFactory: () async => await Future.value(UserStore.to.token),
logging: (level, message) => debugPrint("wgs输出===SignalR Socket-$message"),
))
.withUrl(
'${RequestConfig().baseUrl}/session-manage',
HttpConnectionOptions(
transport: HttpTransportType.webSockets,
accessTokenFactory: () async =>
await Future.value(UserStore.to.token),
logging: (level, message) =>
debugPrint("wgs输出===SignalR Socket-$message"),
))
// 线410 4 10 10
.withAutomaticReconnect([10000, 4000, 10000, 10000]).build();
@ -327,42 +311,41 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
/// ------------------------------------------------------------------------------
///
state.hubConnection.value?.on("ManagerRefresh", (e){
state.hubConnection.value?.on("ManagerRefresh", (e) {
// var jsonStr = const Utf8Decoder().convert(json.encode(e?[0]).runes.toList());
var jsonStr = json.encode(e?[0]);
var listDynamic = jsonDecode(jsonStr);
MeetingRoomUser meetingRoomUser = MeetingRoomUser.fromJson(listDynamic);
if(meetingRoomUser.isRoomManager == true){
if (meetingRoomUser.isRoomManager == true) {
debugPrint("wgs输出===Socket-开启发言权限:${e?[0]}--${e?[1]}");
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == meetingRoomUser.uid){
for (MeetingRoomUser mru in state.cacheUsers.value) {
if (mru.uid == meetingRoomUser.uid) {
mru.roleId = meetingRoomUser.roleId;
mru.enableMicr = true;
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.isOpenMicrophone.value = true;
// SDK角色为主播
setClientRole("主播");
debugPrint("wgs输出===Socket-开启发言权限:主播");
}
}else{
} else {
debugPrint("wgs输出===Socket-关闭发言权限:${e?[0]}--${e?[1]}");
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == meetingRoomUser.uid){
for (MeetingRoomUser mru in state.cacheUsers.value) {
if (mru.uid == meetingRoomUser.uid) {
mru.roleId = meetingRoomUser.roleId;
mru.enableMicr = false;
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.isOpenMicrophone.value = false;
state.isOpenCamera.value = false;
state.isOpenShare.value = false;
state.isSelf.value = false;
state.remoteUid.value = "";
// SDK角色为观众
@ -375,10 +358,9 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
state.floating.value?.close();
//
changePageState(0);
//
//
// stopScreenCapture();
debugPrint("wgs输出===Socket-关闭发言权限:观众");
}
}
@ -386,13 +368,13 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
/// ------------------------------------------------------------------------------
///
state.hubConnection.value?.on("OperAllMicr", (e){
if(e?[0] == true){
state.hubConnection.value?.on("OperAllMicr", (e) {
if (e?[0] == true) {
debugPrint("wgs输出===Socket-全员开麦");
}else{
} else {
debugPrint("wgs输出===Socket-全员闭麦");
}
for(var i = 0; i < state.cacheUsers.value.length; i++){
for (var i = 0; i < state.cacheUsers.value.length; i++) {
state.cacheUsers.value[i].enableMicr = e?[0];
}
state.users.value = state.cacheUsers.value;
@ -400,32 +382,34 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
});
///
state.hubConnection.value?.on("OperMicr", (e){
state.hubConnection.value?.on("OperMicr", (e) {
// var jsonStr = const Utf8Decoder().convert(json.encode(e?[0]).runes.toList());
var jsonStr = json.encode(e?[0]);
var listDynamic = jsonDecode(jsonStr);
MeetingRoomUser meetingRoomUser = MeetingRoomUser.fromJson(listDynamic);
if(meetingRoomUser.enableMicr == true){
debugPrint("wgs输出===Socket-用户单独开麦${meetingRoomUser.uid}-${meetingRoomUser.userName}");
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == meetingRoomUser.uid){
if (meetingRoomUser.enableMicr == true) {
debugPrint(
"wgs输出===Socket-用户单独开麦${meetingRoomUser.uid}-${meetingRoomUser.userName}");
for (MeetingRoomUser mru in state.cacheUsers.value) {
if (mru.uid == meetingRoomUser.uid) {
mru.enableMicr = true;
}
}
if(meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid) {
if (meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid) {
state.isOpenMicrophone.value = true;
//
muteLocalAudioStream(false);
}
}else{
debugPrint("wgs输出===Socket-用户单独闭麦${meetingRoomUser.uid}-${meetingRoomUser.userName}");
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == meetingRoomUser.uid){
} else {
debugPrint(
"wgs输出===Socket-用户单独闭麦${meetingRoomUser.uid}-${meetingRoomUser.userName}");
for (MeetingRoomUser mru in state.cacheUsers.value) {
if (mru.uid == meetingRoomUser.uid) {
mru.enableMicr = false;
}
}
if(meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid) {
if (meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid) {
state.isOpenMicrophone.value = false;
//
@ -436,26 +420,27 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
/// ------------------------------------------------------------------------------
///
state.hubConnection.value?.on("UserJoined", (e){
state.hubConnection.value?.on("UserJoined", (e) {
// var jsonStr = const Utf8Decoder().convert(json.encode(user).runes.toList());
var jsonStr = json.encode(e);
var listDynamic = jsonDecode(jsonStr);
List<MeetingRoomUser> meetingRoomUsers = (listDynamic as List<dynamic>).map((e) => MeetingRoomUser.fromJson((e as Map<String,dynamic>))).toList();
List<MeetingRoomUser> meetingRoomUsers = (listDynamic as List<dynamic>)
.map((e) => MeetingRoomUser.fromJson((e as Map<String, dynamic>)))
.toList();
state.cacheUsers.value.addAll(meetingRoomUsers);
state.users.value = state.cacheUsers.value;
debugPrint("wgs输出===Socket-远端用户或主播加入会议室:$jsonStr");
});
///
state.hubConnection.value?.on("UserLeave", (e){
state.hubConnection.value?.on("UserLeave", (e) {
// var jsonStr = const Utf8Decoder().convert(json.encode(uid).runes.toList());
var jsonStr = json.encode(e);
List listDynamic = jsonDecode(jsonStr);
for(String uidStr in listDynamic){
for(var j = 0; j < state.cacheUsers.value.length; j++){
if(state.cacheUsers.value[j].uid == uidStr){
for (String uidStr in listDynamic) {
for (var j = 0; j < state.cacheUsers.value.length; j++) {
if (state.cacheUsers.value[j].uid == uidStr) {
state.cacheUsers.value.removeAt(j);
doHttpGetTvAnchor();
}
}
}
@ -464,7 +449,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
});
///
state.hubConnection.value?.on("ForceExitRoom", (e){
state.hubConnection.value?.on("ForceExitRoom", (e) {
// var jsonStr = const Utf8Decoder().convert(json.encode(e).runes.toList());
var jsonStr = json.encode(e);
debugPrint("wgs输出===Socket-被移除会议:$jsonStr");
@ -473,7 +458,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
});
///
state.hubConnection.value?.on("AllLeave", (e){
state.hubConnection.value?.on("AllLeave", (e) {
debugPrint("wgs输出===Socket-全员结束会议");
Get.back();
ToastUtils.showSuccess("会议已结束");
@ -481,87 +466,88 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
/// ------------------------------------------------------------------------------
///
state.hubConnection.value?.on("ReceiveMessage", (e){
state.hubConnection.value?.on("ReceiveMessage", (e) {
// var jsonStr = const Utf8Decoder().convert(json.encode(e).runes.toList());
var jsonStr = json.encode(e);
List list = json.decode(jsonStr);
MeetingRoomMsg meetingRoomMsg = MeetingRoomMsg(list[0],list[1],list[2],0);
MeetingRoomMsg meetingRoomMsg =
MeetingRoomMsg(list[0], list[1], list[2], 0);
state.meetingRoomMsgs.value.add(meetingRoomMsg);
update();
Future.delayed(const Duration(milliseconds: 100), () {
state.chatController.jumpTo(state.chatController.position.maxScrollExtent);
state.chatController
.jumpTo(state.chatController.position.maxScrollExtent);
});
debugPrint("wgs输出===Socket-会议室接收消息:$jsonStr");
});
/// ------------------------------------------------------------------------------
///
state.hubConnection.value?.on("OperCamera", (e){
state.hubConnection.value?.on("OperCamera", (e) {
// var jsonStr = const Utf8Decoder().convert(json.encode(e?[0]).runes.toList());
var jsonStr = json.encode(e?[0]);
var listDynamic = jsonDecode(jsonStr);
MeetingRoomUser meetingRoomUser = MeetingRoomUser.fromJson(listDynamic);
if(meetingRoomUser.enableCamera == true){
if (meetingRoomUser.enableCamera == true) {
debugPrint("wgs输出===Socket-用户单独开摄像头");
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == meetingRoomUser.uid){
//
for (MeetingRoomUser mru in state.cacheUsers.value) {
if (mru.uid == meetingRoomUser.uid) {
mru.enableCamera = true;
}
}
if(meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid){
if (meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid) {
//
//
state.isOpenCamera.value = true;
//
muteLocalVideoStream(false);
//
startPreview();
//
if(state.pageIndex.value == 0 && state.isSelf.value == false){
//
//
changePageState(1);
//
if (state.pageIndex.value == 0 && state.remoteUid.value != "0") {
state.floating.value?.open(state.context.value!);
}
changePageState(1);
}
}else{
} else {
debugPrint("wgs输出===Socket-用户单独闭摄像头");
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == meetingRoomUser.uid){
//
for (MeetingRoomUser mru in state.cacheUsers.value) {
if (mru.uid == meetingRoomUser.uid) {
mru.enableCamera = false;
}
}
if(meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid){
if (meetingRoomUser.uid == UserStore.to.userInfoEntity.value!.uid) {
//
//
state.isOpenCamera.value = false;
//
if(state.isSelf.value == true){
changePageState(0);
state.isSelf.value = false;
}
//
muteLocalVideoStream(true);
//
stopPreview();
//
if (state.remoteUid.value == "0") {
changePageState(0);
}
//
state.floating.value?.close();
}else{
if(meetingRoomUser.uid == state.remoteUid.value || meetingRoomUser.screenShareId == state.remoteUid.value){
if(state.isOpenCamera.value == true){
state.remoteUid.value = "";
changePageState(0);
}
if (state.floating.value?.isShowing == true) {
state.floating.value?.close();
}
}
}
});
///
state.hubConnection.value?.on("ShowUser", (e){
state.hubConnection.value?.on("ShowUser", (e) {
// var jsonStr = const Utf8Decoder().convert(json.encode(e).runes.toList());
var jsonStr = json.encode(e);
List list = json.decode(jsonStr);
/*if(list[0].toString().length != 9){
state.remoteUid.value = list[0].toString();
}*/
doHttpGetTvAnchor();
debugPrint("wgs输出===Socket-设置新的全员观看视频主播:${list[0]}");
});
@ -569,13 +555,15 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
///
Future<void> joinMeetingToSocket() async {
await state.hubConnection.value?.invoke("joinChannel", args: [state.roomNumber.value, false, false, false]);
await state.hubConnection.value?.invoke("joinChannel",
args: [state.roomNumber.value, false, false, false]);
mergeFetch();
}
///
Future<void> leaveMeetingToSocket() async {
await state.hubConnection.value?.invoke("levelChannel", args: [state.roomNumber.value]);
await state.hubConnection.value
?.invoke("levelChannel", args: [state.roomNumber.value]);
state.hubConnection.value?.stop();
}
@ -584,13 +572,16 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
MeetingRoomMsg meetingRoomMsg = MeetingRoomMsg(
UserStore.to.userInfoEntity.value!.uid,
UserStore.to.userInfoEntity.value!.userName,
msg,1);
msg,
1);
state.meetingRoomMsgs.value.add(meetingRoomMsg);
update();
Future.delayed(const Duration(milliseconds: 100), () {
state.chatController.jumpTo(state.chatController.position.maxScrollExtent);
state.chatController
.jumpTo(state.chatController.position.maxScrollExtent);
});
await state.hubConnection.value?.invoke("sendChannelMsg", args: [state.roomNumber.value, msg]);
await state.hubConnection.value
?.invoke("sendChannelMsg", args: [state.roomNumber.value, msg]);
}
/// ------------------------------------------------------------------------------SDK相关
@ -615,119 +606,134 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
//
await state.rctEngine.value?.setDefaultAudioRouteToSpeakerphone(false);
//
await state.rctEngine.value?.enableAudioVolumeIndication(interval: 200, smooth: 3, reportVad: true);
await state.rctEngine.value?.enableAudioVolumeIndication(
interval: 200, smooth: 3, reportVad: true);
joinMeetingToRtc();
//
state.rctEngine.value?.registerEventHandler(
RtcEngineEventHandler(
//
onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
debugPrint("wgs输出===RTC-自己加入会议室ID${connection.localUid}");
},
//
onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
debugPrint("wgs输出===RTC-自己加入会议室ID${connection.localUid}");
},
//
onLeaveChannel: (RtcConnection connection, RtcStats stats) {
debugPrint("wgs输出===RTC-自己离开会议室ID${connection.localUid}");
},
//
onLeaveChannel: (RtcConnection connection, RtcStats stats){
debugPrint("wgs输出===RTC-自己离开会议室ID${connection.localUid}");
},
// -
onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) {
debugPrint("wgs输出===RTC-远端用户或主播加入会议室用户或主机的ID$remoteUid");
},
// -
onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) {
debugPrint("wgs输出===RTC-远端用户或主播加入会议室用户或主机的ID$remoteUid");
},
// -
onUserOffline: (RtcConnection connection, int remoteUid,
UserOfflineReasonType reason) async {
debugPrint("wgs输出===RTC-远端用户或主播离开会议室用户或主机的ID$remoteUid");
},
// -
onUserOffline: (RtcConnection connection, int remoteUid, UserOfflineReasonType reason) async {
debugPrint("wgs输出===RTC-远端用户或主播离开会议室用户或主机的ID$remoteUid");
},
//
onAudioRoutingChanged: (int routing) {
debugPrint("wgs输出===RTC-音频路由切换:$routing");
state.communicationMode.value = routing;
if (routing == 1) {
debugPrint("wgs输出===RTC-音频路由切换为听筒");
} else if (routing == 3) {
debugPrint("wgs输出===RTC-音频路由切换为扬声器");
} else {
debugPrint("wgs输出===RTC-音频路由切换为外接设备");
}
},
//
onAudioRoutingChanged: (int routing){
debugPrint("wgs输出===RTC-音频路由切换:$routing");
state.communicationMode.value = routing;
if(routing == 1){
debugPrint("wgs输出===RTC-音频路由切换为听筒");
}else if(routing == 3){
debugPrint("wgs输出===RTC-音频路由切换为扬声器");
}else{
debugPrint("wgs输出===RTC-音频路由切换为外接设备");
//
onLocalAudioStateChanged: (RtcConnection connection,
LocalAudioStreamState state, LocalAudioStreamReason reason) {
debugPrint("wgs输出===RTC-音频采集开关:$state");
},
//
onRemoteVideoStateChanged: (RtcConnection connection,
int remoteUid,
RemoteVideoState remoteVideoState,
RemoteVideoStateReason remoteVideoStateReason,
int elapsed) {
debugPrint(
"wgs输出===RTC-远端视频状态发生改变ID-$remoteUid-状态-$remoteVideoStateReason");
if (remoteVideoStateReason ==
RemoteVideoStateReason.remoteVideoStateReasonRemoteMuted) {
//
if (remoteUid.toString().length != 9) {
//
if (remoteUid.toString() == state.remoteUid.value) {
//
doHttpGetTvAnchor();
}
} else {
//
}
},
}
},
//
onLocalAudioStateChanged: (RtcConnection connection, LocalAudioStreamState state, LocalAudioStreamReason reason){
debugPrint("wgs输出===RTC-音频采集开关:$state");
},
//
onRemoteVideoStateChanged: (RtcConnection connection,
int remoteUid,
RemoteVideoState state,
RemoteVideoStateReason reason,
int elapsed){
debugPrint("wgs输出===RTC-远端视频状态发生改变:$state");
},
//
onAudioVolumeIndication: (
RtcConnection connection,
List<AudioVolumeInfo> speakers,
int speakerNumber,
int totalVolume){
if(speakers.isNotEmpty){
for(AudioVolumeInfo avi in speakers){
for(MeetingRoomUser mru in state.cacheUsers.value){
//
if(avi.uid == 0){
//debugPrint("wgs输出===RTC-用户音量提示(自己):${CountMicrophoneVolume.getVolume(avi.volume!)}");
//
onAudioVolumeIndication: (RtcConnection connection,
List<AudioVolumeInfo> speakers,
int speakerNumber,
int totalVolume) {
if (speakers.isNotEmpty) {
for (AudioVolumeInfo avi in speakers) {
for (MeetingRoomUser mru in state.cacheUsers.value) {
//
if (avi.uid == 0) {
//debugPrint("wgs输出===RTC-用户音量提示(自己):${CountMicrophoneVolume.getVolume(avi.volume!)}");
mru.volume = CountMicrophoneVolume.getVolume(avi.volume!);
state.microphoneVolume.value =
CountMicrophoneVolume.getVolume(avi.volume!);
} else {
if (avi.uid.toString() == mru.uid) {
//debugPrint("wgs输出===RTC-用户音量提示(远端用户):${speakers[0].uid}--${speakers[0].volume}");
mru.volume = CountMicrophoneVolume.getVolume(avi.volume!);
state.microphoneVolume.value = CountMicrophoneVolume.getVolume(avi.volume!);
}else{
if(avi.uid.toString() == mru.uid){
//debugPrint("wgs输出===RTC-用户音量提示(远端用户):${speakers[0].uid}--${speakers[0].volume}");
mru.volume = CountMicrophoneVolume.getVolume(avi.volume!);
if(avi.volume != 0){
state.spokesman.value = mru.userName;
state.spokesmanVolume.value = CountMicrophoneVolume.getVolume(avi.volume!);
}else{
state.spokesman.value = "";
state.spokesmanVolume.value = 0;
}
if (avi.volume != 0) {
state.spokesman.value = mru.userName;
state.spokesmanVolume.value =
CountMicrophoneVolume.getVolume(avi.volume!);
} else {
state.spokesman.value = "";
state.spokesmanVolume.value = 0;
}
}
}
}
}
},
}
},
//
onClientRoleChanged: (
RtcConnection connection,
ClientRoleType oldRole,
ClientRoleType newRole,
ClientRoleOptions newRoleOptions){
debugPrint("wgs输出===RTC-切换用户角色为:${newRole == ClientRoleType.clientRoleBroadcaster ? "主播" : "观众"}");
},
//
onClientRoleChanged: (RtcConnection connection, ClientRoleType oldRole,
ClientRoleType newRole, ClientRoleOptions newRoleOptions) {
debugPrint(
"wgs输出===RTC-切换用户角色为:${newRole == ClientRoleType.clientRoleBroadcaster ? "主播" : "观众"}");
},
// token即将在30秒内过期回调
onTokenPrivilegeWillExpire: (RtcConnection connection, String token){
doHttpGetMeetingToken(false);
},
// token即将在30秒内过期回调
onTokenPrivilegeWillExpire: (RtcConnection connection, String token) {
doHttpGetMeetingToken(false);
},
//
onLocalVideoStateChanged: (VideoSourceType source, LocalVideoStreamState state, LocalVideoStreamReason reason){
debugPrint("wgs输出===RTC-本地视频状态发生改变:$source--$state--$reason");
},
//
onLocalVideoStateChanged: (VideoSourceType source,
LocalVideoStreamState state, LocalVideoStreamReason reason) {
debugPrint("wgs输出===RTC-本地视频状态发生改变:$source--$state--$reason");
},
//
/*onPermissionError: (PermissionType permissionType){
//
/*onPermissionError: (PermissionType permissionType){
debugPrint("wgs输出===RTC-获取设备权限出错:$permissionType");
if(permissionType == PermissionType.screenCapture){
//
//
state.isOpenShare.value = false;
stopScreenCapture();
}
@ -743,19 +749,19 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
channelId: state.roomNumber.value,
uid: int.parse(UserStore.to.userInfoEntity.value!.uid),
options: const ChannelMediaOptions(
//
autoSubscribeVideo: true,
//
autoSubscribeAudio: true,
//
publishCameraTrack: true,
//
publishMicrophoneTrack: true,
// clientRoleBroadcaster clientRoleAudience
// clientRoleBroadcaster
//
//
clientRoleType: ClientRoleType.clientRoleAudience),
//
autoSubscribeVideo: true,
//
autoSubscribeAudio: true,
//
publishCameraTrack: true,
//
publishMicrophoneTrack: true,
// clientRoleBroadcaster clientRoleAudience
// clientRoleBroadcaster
//
//
clientRoleType: ClientRoleType.clientRoleAudience),
);
}
@ -769,17 +775,20 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
///
Future<void> setClientRole(String roleStr) async {
if(roleStr == "主播"){
await state.rctEngine.value?.setClientRole(role: ClientRoleType.clientRoleBroadcaster);
}else{
await state.rctEngine.value?.setClientRole(role: ClientRoleType.clientRoleAudience);
if (roleStr == "主播") {
await state.rctEngine.value
?.setClientRole(role: ClientRoleType.clientRoleBroadcaster);
} else {
await state.rctEngine.value
?.setClientRole(role: ClientRoleType.clientRoleAudience);
}
}
///
Future<void> setEnableSpeakerphone(int mode) async {
state.communicationMode.value = mode;
await state.rctEngine.value?.setEnableSpeakerphone(mode == 1 ? false : true);
await state.rctEngine.value
?.setEnableSpeakerphone(mode == 1 ? false : true);
}
///
@ -789,7 +798,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
///
Future<void> muteLocalAudioStream(bool mute) async {
await state.rctEngine.value?.muteLocalAudioStream(mute);
await state.rctEngine.value?.muteLocalAudioStream(mute);
}
///

View File

@ -43,7 +43,7 @@ class MeetingMainState {
/// token
late RxString meetingToken = "".obs;
///
late Rx<MeetingRoomInfo?> meetingRoomInfo = Rx(null);
@ -70,8 +70,6 @@ class MeetingMainState {
late RxBool isOpenShare = false.obs;
/// ID
late RxString remoteUid = "".obs;
///
late RxBool isSelf = false.obs;
///
late RxString spokesman = "".obs;

View File

@ -10,11 +10,8 @@ import 'package:get/get.dart';
import 'package:liquid_progress_indicator_v2/liquid_progress_indicator.dart';
import 'package:preload_page_view/preload_page_view.dart';
import 'package:wgshare/common/store/user_store.dart';
import 'package:wgshare/pages/metting/share/meeting_main_share_view.dart';
import 'package:wgshare/pages/metting/video/meeting_main_video_view.dart';
import 'package:wgshare/utils/toast_utils.dart';
import '../../common/models/meeting_room_user.dart';
import '../../utils/color_util.dart';
import '../../utils/cus_behavior.dart';
import '../../view/view_svg_path.dart';
@ -87,8 +84,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
width: 20.w,
height: 20.h,
),
onTap: () {
},
onTap: () {},
),
SizedBox(width: 16.w),
GestureDetector(
@ -178,7 +174,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
height: 22.h,
),
onTap: () {
logic.doHttpCancelSpeak();
logic.cancelSpeak();
},
),
),
@ -215,109 +211,81 @@ class MeetingMainPageState extends State<MeetingMainPage> {
child: MeetingMainVoiceComponent(
users: state.cacheUsers.value)),
// -
// -
Visibility(
visible: state.pageState.value == 1 && state.isSelf.value == false,
visible: state.pageState.value == 1,
child: null != state.rctEngine.value
? Stack(
alignment: Alignment.center,
children: [
PreloadPageView.builder(
preloadPagesCount: 2,
itemCount: 2,
itemBuilder: (BuildContext context, int position) => returnPageToOther(position),
controller: PreloadPageController(initialPage: 0),
onPageChanged: (int position) {
state.pageIndex.value = position;
if(state.isSpeak.value == true && state.isOpenCamera.value == true && state.isSelf.value == false){
if(position == 0){
state.floating.value?.open(context);
}else{
state.floating.value?.close();
}
}
},
),
/// pageview
Positioned(
bottom: 16,
child: Row(
alignment: Alignment.center,
children: [
Container(
width: 8.w,
height: 8.h,
margin: const EdgeInsets.only(right: 6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: state.pageIndex.value == 0
? ColorUtil.Color_255_255_255
: ColorUtil.Color_108_108_108),
PreloadPageView.builder(
preloadPagesCount: 2,
itemCount: 2,
itemBuilder: (BuildContext context,
int position) =>
returnPage(position),
controller: PreloadPageController(
initialPage: 0),
onPageChanged: (int position) {
state.pageIndex.value = position;
if (state.isSpeak.value == true &&
state.isOpenCamera.value ==
true &&
state.remoteUid.value != "0") {
if (position == 0) {
state.floating.value
?.open(context);
} else {
state.floating.value?.close();
}
}
},
),
Container(
width: 8.w,
height: 8.h,
margin: const EdgeInsets.only(left: 6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: state.pageIndex.value == 1
? ColorUtil.Color_255_255_255
: ColorUtil.Color_108_108_108),
)
],
),
),
],
)
: Container()),
// -
Visibility(
visible: state.pageState.value == 1 && state.isSelf.value == true,
child: null != state.rctEngine.value
? Stack(
alignment: Alignment.center,
children: [
PreloadPageView.builder(
preloadPagesCount: 2,
itemCount: 2,
itemBuilder: (BuildContext context, int position) => returnPageSelf(position),
controller: PreloadPageController(initialPage: 0),
onPageChanged: (int position) {
state.pageIndex.value = position;
},
),
/// pageview
Positioned(
bottom: 16,
child: Row(
children: [
Container(
width: 8.w,
height: 8.h,
margin: const EdgeInsets.only(right: 6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: state.pageIndex.value == 0
? ColorUtil.Color_255_255_255
: ColorUtil.Color_108_108_108),
/// pageview
Positioned(
bottom: 16,
child: Row(
children: [
Container(
width: 8.w,
height: 8.h,
margin: const EdgeInsets.only(
right: 6),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(
8),
color: state.pageIndex
.value ==
0
? ColorUtil
.Color_255_255_255
: ColorUtil
.Color_108_108_108),
),
Container(
width: 8.w,
height: 8.h,
margin: const EdgeInsets.only(
left: 6),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(
8),
color: state.pageIndex
.value ==
1
? ColorUtil
.Color_255_255_255
: ColorUtil
.Color_108_108_108),
)
],
),
),
Container(
width: 8.w,
height: 8.h,
margin: const EdgeInsets.only(left: 6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: state.pageIndex.value == 1
? ColorUtil.Color_255_255_255
: ColorUtil.Color_108_108_108),
)
],
),
),
],
)
)
: Container()),
GestureDetector(
@ -482,7 +450,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
},
),
///
///
/*GestureDetector(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
@ -799,7 +767,7 @@ class MeetingMainPageState extends State<MeetingMainPage> {
padding: const EdgeInsets.only(top: 16, bottom: 16),
margin: const EdgeInsets.only(left: 40, right: 40),
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(6)),
borderRadius: const BorderRadius.all(Radius.circular(6)),
border: Border.all(color: ColorUtil.Color_0_0_0_0),
color: ColorUtil.Color_35_35_35,
),
@ -1459,7 +1427,9 @@ class MeetingMainPageState extends State<MeetingMainPage> {
? AgoraVideoView(
controller: VideoViewController(
rtcEngine: state.rctEngine.value!,
canvas: const VideoCanvas(uid: 0, setupMode: VideoViewSetupMode.videoViewSetupAdd),
canvas: const VideoCanvas(
uid: 0,
setupMode: VideoViewSetupMode.videoViewSetupAdd),
),
)
: const CircularProgressIndicator(),
@ -1482,20 +1452,10 @@ class MeetingMainPageState extends State<MeetingMainPage> {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2),
color: ColorUtil.Color_0_0_0_96),
child: Row(
children: [
/*Image.asset(
'assets/images/meeting_main_microphone_open.png',
width: 13.w,
height: 14.h,
),
SizedBox(width: 4.w),*/
Text(
UserStore.to.userInfoEntity.value!.userName,
style: TextStyle(
fontSize: 10.sp, color: ColorUtil.Color_185_184_184),
)
],
child: Text(
UserStore.to.userInfoEntity.value!.userName,
style: TextStyle(
fontSize: 10.sp, color: ColorUtil.Color_185_184_184),
),
)
],
@ -1505,240 +1465,43 @@ class MeetingMainPageState extends State<MeetingMainPage> {
);
}
/// -
Widget returnPageToOther(int position){
debugPrint("wgs输出===:全员观看是别人时布局");
/// pageview对应页数的界面
Widget returnPage(int position) {
var pageList = [];
///
pageList.add(Stack(
alignment: Alignment.center,
children: [
state.remoteUid.value != ""
? AgoraVideoView(
controller: VideoViewController(
rtcEngine: state.rctEngine.value!,
canvas: VideoCanvas(uid: int.tryParse(state.remoteUid.value), setupMode: VideoViewSetupMode.videoViewSetupAdd)
),
)
: const CircularProgressIndicator(),
/*Positioned(
bottom: 110,
child: GestureDetector(
child: Image.asset(
'assets/images/meeting_main_hang_up.png',
width: 50.w,
height: 50.h,
),
onTap: () {
},
),
),*/
Positioned(
top: 16,
right: 16,
child: Container(
height: 30,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: ColorUtil.Color_0_0_0_96),
padding: const EdgeInsets.only(left: 12, right: 12),
child: Row(
children: [
Text(
'正在讲话:',
style: TextStyle(
fontSize: 10.sp,
color: ColorUtil.Color_185_184_184),
controller: VideoViewController(
rtcEngine: state.rctEngine.value!,
canvas: VideoCanvas(
uid: int.tryParse(state.remoteUid.value),
setupMode: VideoViewSetupMode.videoViewSetupAdd),
),
SizedBox(
width: 20.w,
height: 20.h,
child: LiquidCustomProgressIndicator(
value:
state.spokesmanVolume.value,
valueColor:
const AlwaysStoppedAnimation(
ColorUtil
.Color_2_177_136),
backgroundColor:
ColorUtil.Color_255_255_255,
direction: Axis.vertical,
shapePath: ViewSvgPath
.getMicrpphonePath()),
),
Text(
state.spokesman.value,
style: TextStyle(
fontSize: 10.sp,
color: ColorUtil.Color_185_184_184),
)
],
),
),
),
],
));
/// gridview
pageList.add(Container(
color: ColorUtil.Color_57_57_57,
child: GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 0.8,
crossAxisSpacing: 0),
itemCount: state.cacheUsers.value.length,
itemBuilder: (BuildContext ctx, index) {
return Stack(
children: [
state.cacheUsers.value[index].enableCamera == true ? state.cacheUsers.value[index].uid ==
UserStore.to.userInfoEntity.value!.uid
? AgoraVideoView(
controller: VideoViewController(
rtcEngine: state.rctEngine.value!,
canvas: const VideoCanvas(uid: 0, setupMode: VideoViewSetupMode.videoViewSetupAdd)
),
)
: AgoraVideoView(
controller: VideoViewController.remote(
rtcEngine: state.rctEngine.value!,
canvas: VideoCanvas(
uid: int.tryParse(
state.cacheUsers.value[index].uid), setupMode: VideoViewSetupMode.videoViewSetupAdd),
connection: RtcConnection(
channelId: state.roomNumber.value),
),
)
:
Container(
color: ColorUtil.Color_16_19_13,
child: SizedBox(
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/images/metting_main_no_person.png',
width: 78.w,
height: 84.h,
),
const SizedBox(height: 12),
Text(
'该用户未开启摄像头...',
style: TextStyle(
color: ColorUtil.Color_255_255_255,
fontSize: 10.sp
),
)
],
)
: Container(
width: double.infinity,
color: ColorUtil.Color_57_57_57,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/images/metting_main_no_person.png',
width: 138.w,
height: 144.h,
),
),
const SizedBox(height: 20),
Text(
'主持人正在赶来的路上...',
style: TextStyle(
color: ColorUtil.Color_255_255_255, fontSize: 14.sp),
)
],
),
Positioned(
left: 4,
bottom: 4,
child: Row(
children: [
Visibility(
visible: state.cacheUsers.value[index].uid == UserStore.to.userInfoEntity.value!.uid,
child: Image.asset(
'assets/images/meeting_main_own.png',
width: 24.w,
height: 24.h,
),
),
Container(
height: 20,
margin: const EdgeInsets.only(left: 4),
padding:
const EdgeInsets.only(left: 4, right: 4),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2),
color: ColorUtil.Color_0_0_0_96),
child: state.cacheUsers.value[index].enableMicr == true
? Row(
mainAxisAlignment:
MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
SizedBox(
width: 20.w,
height: 20.h,
child: LiquidCustomProgressIndicator(
value:
state.cacheUsers.value[index]
.volume ??
0.0,
valueColor:
const AlwaysStoppedAnimation(
ColorUtil
.Color_2_177_136),
backgroundColor:
ColorUtil.Color_255_255_255,
direction: Axis.vertical,
shapePath: ViewSvgPath
.getMicrpphonePath()),
),
],
)
: Row(
mainAxisAlignment:
MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
Image.asset(
'assets/images/meeting_main_microphone_open.png',
width: 20.w,
height: 20.h,
),
Text(
state.cacheUsers.value[index].userName,
style: TextStyle(
fontSize: 12.sp,
color: ColorUtil
.Color_255_255_255),
)
],
),
)
],
),
)
],
);
}),
));
return pageList[position];
}
/// -
Widget returnPageSelf(int position){
debugPrint("wgs输出===:全员观看是自己时布局");
var pageList = [];
///
pageList.add(Stack(
alignment: Alignment.center,
children: [
AgoraVideoView(
controller: VideoViewController(
rtcEngine: state.rctEngine.value!,
canvas: const VideoCanvas(uid: 0, setupMode: VideoViewSetupMode.videoViewSetupAdd),
),
),
/*Positioned(
bottom: 110,
child: GestureDetector(
child: Image.asset(
'assets/images/meeting_main_hang_up.png',
width: 50.w,
height: 50.h,
),
onTap: () {
},
),
),*/
),
Positioned(
top: 16,
right: 16,
@ -1753,30 +1516,23 @@ class MeetingMainPageState extends State<MeetingMainPage> {
Text(
'正在讲话:',
style: TextStyle(
fontSize: 10.sp,
color: ColorUtil.Color_185_184_184),
fontSize: 10.sp, color: ColorUtil.Color_185_184_184),
),
SizedBox(
width: 20.w,
height: 20.h,
child: LiquidCustomProgressIndicator(
value:
state.spokesmanVolume.value,
valueColor:
const AlwaysStoppedAnimation(
ColorUtil
.Color_2_177_136),
backgroundColor:
ColorUtil.Color_255_255_255,
value: state.spokesmanVolume.value,
valueColor: const AlwaysStoppedAnimation(
ColorUtil.Color_2_177_136),
backgroundColor: ColorUtil.Color_255_255_255,
direction: Axis.vertical,
shapePath: ViewSvgPath
.getMicrpphonePath()),
shapePath: ViewSvgPath.getMicrpphonePath()),
),
Text(
state.spokesman.value,
style: TextStyle(
fontSize: 10.sp,
color: ColorUtil.Color_185_184_184),
fontSize: 10.sp, color: ColorUtil.Color_185_184_184),
)
],
),
@ -1784,68 +1540,71 @@ class MeetingMainPageState extends State<MeetingMainPage> {
),
],
));
/// gridview
pageList.add(Container(
color: ColorUtil.Color_57_57_57,
child: GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 0.8,
crossAxisSpacing: 0),
crossAxisCount: 2, childAspectRatio: 0.8, crossAxisSpacing: 0),
itemCount: state.cacheUsers.value.length,
itemBuilder: (BuildContext ctx, index) {
return Stack(
children: [
state.cacheUsers.value[index].enableCamera == true ? state.cacheUsers.value[index].uid ==
UserStore.to.userInfoEntity.value!.uid
? AgoraVideoView(
controller: VideoViewController(
rtcEngine: state.rctEngine.value!,
canvas: const VideoCanvas(uid: 0, setupMode: VideoViewSetupMode.videoViewSetupAdd)
),
)
: AgoraVideoView(
controller: VideoViewController.remote(
rtcEngine: state.rctEngine.value!,
canvas: VideoCanvas(
uid: int.tryParse(
state.cacheUsers.value[index].uid), setupMode: VideoViewSetupMode.videoViewSetupAdd),
connection: RtcConnection(
channelId: state.roomNumber.value),
),
)
:
Container(
color: ColorUtil.Color_16_19_13,
child: SizedBox(
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/images/metting_main_no_person.png',
width: 78.w,
height: 84.h,
),
const SizedBox(height: 12),
Text(
'该用户未开启摄像头...',
style: TextStyle(
color: ColorUtil.Color_255_255_255,
fontSize: 10.sp
state.cacheUsers.value[index].enableCamera == true
? state.cacheUsers.value[index].uid ==
UserStore.to.userInfoEntity.value!.uid
? AgoraVideoView(
controller: VideoViewController(
rtcEngine: state.rctEngine.value!,
canvas: const VideoCanvas(
uid: 0,
setupMode:
VideoViewSetupMode.videoViewSetupAdd)),
)
: AgoraVideoView(
controller: VideoViewController.remote(
rtcEngine: state.rctEngine.value!,
canvas: VideoCanvas(
uid: int.tryParse(
state.cacheUsers.value[index].uid),
setupMode:
VideoViewSetupMode.videoViewSetupAdd),
connection: RtcConnection(
channelId: state.roomNumber.value),
),
)
: Container(
color: ColorUtil.Color_16_19_13,
child: SizedBox(
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/images/metting_main_no_person.png',
width: 78.w,
height: 84.h,
),
const SizedBox(height: 12),
Text(
'该用户未开启摄像头...',
style: TextStyle(
color: ColorUtil.Color_255_255_255,
fontSize: 10.sp),
)
],
),
)
],
),
),
),
),
),
Positioned(
left: 4,
bottom: 4,
child: Row(
children: [
Visibility(
visible: state.cacheUsers.value[index].uid == UserStore.to.userInfoEntity.value!.uid,
visible: state.cacheUsers.value[index].uid ==
UserStore.to.userInfoEntity.value!.uid,
child: Image.asset(
'assets/images/meeting_main_own.png',
width: 24.w,
@ -1855,65 +1614,56 @@ class MeetingMainPageState extends State<MeetingMainPage> {
Container(
height: 20,
margin: const EdgeInsets.only(left: 4),
padding:
const EdgeInsets.only(left: 4, right: 4),
padding: const EdgeInsets.only(left: 4, right: 4),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2),
color: ColorUtil.Color_0_0_0_96),
child: state.cacheUsers.value[index].enableMicr == true
? Row(
mainAxisAlignment:
MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
SizedBox(
width: 20.w,
height: 20.h,
child: LiquidCustomProgressIndicator(
value:
state.cacheUsers.value[index]
.volume ??
0.0,
valueColor:
const AlwaysStoppedAnimation(
ColorUtil
.Color_2_177_136),
backgroundColor:
ColorUtil.Color_255_255_255,
direction: Axis.vertical,
shapePath: ViewSvgPath
.getMicrpphonePath()),
),
Text(
state.cacheUsers.value[index].userName,
style: TextStyle(
fontSize: 12.sp,
color: ColorUtil
.Color_255_255_255),
)
],
)
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
width: 20.w,
height: 20.h,
child: LiquidCustomProgressIndicator(
value: state.cacheUsers.value[index]
.volume ??
0.0,
valueColor:
const AlwaysStoppedAnimation(
ColorUtil.Color_2_177_136),
backgroundColor:
ColorUtil.Color_255_255_255,
direction: Axis.vertical,
shapePath:
ViewSvgPath.getMicrpphonePath()),
),
Text(
state.cacheUsers.value[index].userName,
style: TextStyle(
fontSize: 12.sp,
color: ColorUtil.Color_255_255_255),
)
],
)
: Row(
mainAxisAlignment:
MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
Image.asset(
'assets/images/meeting_main_microphone_open.png',
width: 20.w,
height: 20.h,
),
Text(
state.cacheUsers.value[index].userName,
style: TextStyle(
fontSize: 12.sp,
color: ColorUtil
.Color_255_255_255),
)
],
),
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
'assets/images/meeting_main_microphone_open.png',
width: 20.w,
height: 20.h,
),
Text(
state.cacheUsers.value[index].userName,
style: TextStyle(
fontSize: 12.sp,
color: ColorUtil.Color_255_255_255),
)
],
),
)
],
),
@ -1924,5 +1674,4 @@ class MeetingMainPageState extends State<MeetingMainPage> {
));
return pageList[position];
}
}

View File

@ -7,6 +7,7 @@ import Foundation
import agora_rtc_engine
import device_info_plus
import flutter_inappwebview_macos
import geolocator_apple
import iris_method_channel
import package_info_plus
@ -16,6 +17,7 @@ import sqflite_darwin
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
AgoraRtcNgPlugin.register(with: registry.registrar(forPlugin: "AgoraRtcNgPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
IrisMethodChannelPlugin.register(with: registry.registrar(forPlugin: "IrisMethodChannelPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))

File diff suppressed because it is too large Load Diff

View File

@ -86,7 +86,8 @@ dependencies:
preload_page_view: ^0.2.0
# webview
webview_flutter: ^3.0.4
#webview_flutter: ^3.0.4
flutter_inappwebview: ^6.1.5
dev_dependencies:
flutter_test:

View File

@ -7,6 +7,7 @@
#include "generated_plugin_registrant.h"
#include <agora_rtc_engine/agora_rtc_engine_plugin.h>
#include <flutter_inappwebview_windows/flutter_inappwebview_windows_plugin_c_api.h>
#include <geolocator_windows/geolocator_windows.h>
#include <iris_method_channel/iris_method_channel_plugin_c_api.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h>
@ -14,6 +15,8 @@
void RegisterPlugins(flutter::PluginRegistry* registry) {
AgoraRtcEnginePluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("AgoraRtcEnginePlugin"));
FlutterInappwebviewWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterInappwebviewWindowsPluginCApi"));
GeolocatorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("GeolocatorWindows"));
IrisMethodChannelPluginCApiRegisterWithRegistrar(

View File

@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST
agora_rtc_engine
flutter_inappwebview_windows
geolocator_windows
iris_method_channel
permission_handler_windows