From 68e8c5c1c9ddfc460e4b19d95a6edd3b2cf145c1 Mon Sep 17 00:00:00 2001 From: fuenmao <980740792@qq.com> Date: Tue, 26 Nov 2024 16:00:28 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=8E=B7=E5=8F=96=E4=BC=9A=E8=AE=AE=E5=AE=A4?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8=202.?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BC=9A=E8=AE=AE=E5=AE=A4token=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=B0=83=E7=94=A8=203.=E8=8E=B7=E5=8F=96=E4=BC=9A?= =?UTF-8?q?=E8=AE=AE=E5=AE=A4=E6=89=80=E6=9C=89=E6=88=90=E5=91=98=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=B0=83=E7=94=A8=204.=E6=88=90=E5=91=98=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=B8=B2=E6=9F=93=E5=92=8C=E9=80=BB=E8=BE=91=E5=A4=84?= =?UTF-8?q?=E7=90=86=205.SignalR=20Socket=E9=95=BF=E8=BF=9E=E6=8E=A5=205.1?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E4=BC=9A=E8=AE=AE=E5=AE=A4=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/2.0x/meeting_main_camera_close.png | Bin 0 -> 766 bytes .../2.0x/meeting_main_microphone_close.png | Bin 1126 -> 861 bytes .../2.0x/meeting_main_microphone_open.png | Bin 0 -> 1126 bytes .../images/3.0x/meeting_main_camera_close.png | Bin 0 -> 1076 bytes .../3.0x/meeting_main_microphone_close.png | Bin 1571 -> 1225 bytes .../3.0x/meeting_main_microphone_open.png | Bin 0 -> 1571 bytes .../images/meeting_main_camera_close.png | Bin 0 -> 410 bytes .../images/meeting_main_microphone_close.png | Bin 619 -> 446 bytes .../images/meeting_main_microphone_open.png | Bin 0 -> 619 bytes wgshare/lib/common/api/retrofit_client.dart | 20 +++ .../lib/common/models/meeting_room_info.dart | 32 ++++ .../lib/common/models/meeting_room_user.dart | 45 ++++++ wgshare/lib/pages/homePage/home_view.dart | 2 +- wgshare/lib/pages/loginPage/login_logic.dart | 2 +- .../lib/pages/metting/meeting_main_logic.dart | 126 +++++++++++++++- .../lib/pages/metting/meeting_main_state.dart | 33 ++++ .../lib/pages/metting/meeting_main_view.dart | 142 ++++++------------ .../share/meeting_main_share_view.dart | 2 +- .../video/meeting_main_video_view.dart | 4 +- .../voice/meeting_main_voice_view.dart | 28 ++-- wgshare/lib/pages/userPage/user_view.dart | 20 +-- .../Flutter/GeneratedPluginRegistrant.swift | 4 + wgshare/pubspec.lock | 88 ++++++++--- wgshare/pubspec.yaml | 11 +- .../flutter/generated_plugin_registrant.cc | 6 + .../windows/flutter/generated_plugins.cmake | 2 + 26 files changed, 418 insertions(+), 149 deletions(-) create mode 100644 wgshare/assets/images/2.0x/meeting_main_camera_close.png create mode 100644 wgshare/assets/images/2.0x/meeting_main_microphone_open.png create mode 100644 wgshare/assets/images/3.0x/meeting_main_camera_close.png create mode 100644 wgshare/assets/images/3.0x/meeting_main_microphone_open.png create mode 100644 wgshare/assets/images/meeting_main_camera_close.png create mode 100644 wgshare/assets/images/meeting_main_microphone_open.png create mode 100644 wgshare/lib/common/models/meeting_room_info.dart create mode 100644 wgshare/lib/common/models/meeting_room_user.dart diff --git a/wgshare/assets/images/2.0x/meeting_main_camera_close.png b/wgshare/assets/images/2.0x/meeting_main_camera_close.png new file mode 100644 index 0000000000000000000000000000000000000000..ee4dfdf06f4e6376be9eba1399f67936eea5a9fa GIT binary patch literal 766 zcmV-ioGZ0ihx`R?Bs*YboO0{5-rFABX>q2GrKqrRVuIRuYYiB}ELbu0r3y z0Q|kYgzLS%sG+;QkcrJENDy1WilF);IjXO#?d^8Mbm)MtrHBt(TfDv~g@O87q5TM38#*8n zsfha0F)U1>4SvCACPh#R^NWkTAK1S}=?99@{$$Inm6#NfFBG`k!_7^*`l8cDRkTi& z)NhEv)BZ&%q*Ow4Tj0=tA~q8uu_&n{h(TXI|6E^G^gs9azqZ~dF$@EmMuPKOS`r{OwNQx?$cg)!T(tO@D4kRtw< zkb_;#!>^$++b+w@OI3<+rl(Cj<6Ha}&olg^btH*y31Jw=$F}#haVp9;na{M;rHHZ9 w(<0VY6{SeX6peokS;5#Gh9;A~9zBxg5hPcoPd6tC=>Px#07*qoM6N<$g2_c%EdT%j literal 0 HcmV?d00001 diff --git a/wgshare/assets/images/2.0x/meeting_main_microphone_close.png b/wgshare/assets/images/2.0x/meeting_main_microphone_close.png index 2fb8865f38979e30ef40292056b3918e487d9383..49bd7ef86685f556f698897126c8f1477cce2d65 100644 GIT binary patch delta 824 zcmV-81IPU42;BxDiBL{Q4GJ0x0000DNk~Le0000Z0000Y2nGNE0M&(H{E;Cve**GJ zL_t(|0qs{YZ__{&el}944h9J|6LJS;8u170N?kgXv|E=Z44rY?xk{=^mAbTM>6*~F zRfE)}OX5EOiI5^OAmSpSrXZ+Mix3s~c+WnAfjB-Vj-XOM>FMsC@6Mm!y?gH&;2Ku| z5)1&wSPq*!io#V-P%KH3Y)Bgoe@#=LX<7mPCZV9zS$DKiCZG>UJ%}hE%Wa^qcHL~& zvYH_>74R(*1qUUY)IxI91AMvT`esMU(t$_LC!)m=A<$d{5<>3v@P4gk;MMnx-? zxjF}8cmN3@$If7E7JRek(0}M_6%d082@y*MkIP1%dFV}+<>Kd7>mCdVfAN;_302X5 z9%ENI-q@J8I51?C!$l=_#a%L}UneR#xEl+#HbKyjos{H2o)*30UlYz{_f~Sb^p9*h-h;3u8a$pcpE((2_#&r`YXQVjZ-1MyTa&eJ;J3kNRl|t*= zTvvuPzbw$38^lIFDL~j$Ne*-eHibBLxDi2V! z8>6E)(V2C6{^9UYY3e!)h+tFV>(^2(xWY%nEmR0QBwEHG>!6%{vF&>3XiG2*a6;|h zFO7GEp1fXN{pmm98#pxZt7>#1#lrrBvJDB5I0Do4L@`muahL@^n-iMoKRWjxf`Qec zXd%`gnLmh83<~1Ve;=0^LSg3zQE2P1x(}2jGVT6A3QG?cEO<6Prf@Q=R72)GU^)b#LUlI+h?7q)di> z&`g1;RdRHSKiH?6WutY*;a}squ2+&c@-_Zz`~dvkBCK(c4s2im0000T5PMpM!LsX=E(vvTD=esX=-+T9bKpSm5Y$!Ad zWSX6L@+8H@E+~}*QGuTY6pL$We{5_OO+r%$)BJoAcXt^sCaQGFGx0tqeu9`Vsx=T# z&NhKMu*qgooh+<2rLr_VokUCo5@w>E{16f*morq0j9%GJ)Pqu;FpP{PofxRL!V7Ro z_OfM}bj9k>>}(3PSGF7pTjvd<8etQnJMTomaezd=Au5Qv5d(pQ*%R|@e=oWCtE@>R zvf`0Q^zAi_cZdO_RwI)h;zydT;HgeQOC-Uo^$abBQLls2dVY^eiJar`@C90ox`YKv zlNHiyzJ}dhU~3DwzDBDMim-r57nGJm+ShP&1S~EB7Z+#+LKAjiOGF$pU#b+cOH07P z0qz@-2@7nA^x(}K*BP&_f3!rz?olEQ5f)gaKY#v<4SpT=Y!tHJzXPvdyLBQFi6A18TI0^l^hQaFLJ{ViA%TvLEL(;L zPn8;!I)|6^*RKea$o#x35u!hyaZ@}-hEKoau%x3)!Z5l@zDa zBHNz#gLkaf^kF)wk&!%{XOk=g+l7UcG{kv`A!b&OIHSyn??@!Y21o zR#=~MoYy+CQ0a7mCz}lH?dZB(BA1s#B$?m9fMk9Nd(3TwL=?jApoTHwB;smxR91Pi z>RTd_FJGjT_tYk_f4OPm?9BPShL8w?qr_>r@JN+Q1EX)__GACXM#l}N#=d;3=M zkRCR7+eISl>%hiF&K^4)4@7_!EqFWO=E1ADxk)S2EClp(wC~o-uI%h&+4;&NLXNFp z`F9~cVVg`h^!J{FJZ^9M)%bX>=6f8+IV{SqB&=w$w^x1|f9Bcxly?`JLD-s{gFQQn zOzwVh5XnSq{84(smbdC2JxZ`8x$h_b)$JLgfYZ}7%fWR#7pAJ=6Aj->*xO$3^FH83 z+UGxza^ylf`}JcSc4Y~y)ooD}q{~K|e$@P`@jZL^T zsjN6rl0)9Nf70PXw9S9yHD|`mREUykfCG%DtL>fn!3i zZZ4=#2mT`{9m9ue^@*Pkw-~V`VI2gIA18S0U1u?jUN*<;O^(sNjILh1u7`Mp=jJlL z>@6I`0ejFO;z@$2k(Wfg6-8PUeW!9V#}Y6R*(%-a9}002ov JPDHLkV1i5j2r2*o diff --git a/wgshare/assets/images/2.0x/meeting_main_microphone_open.png b/wgshare/assets/images/2.0x/meeting_main_microphone_open.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb8865f38979e30ef40292056b3918e487d9383 GIT binary patch literal 1126 zcmV-s1eyDZP)Qm9}>2?J~h zBqUbSzkrklkRY$``Rv$EoWzbpRHS^;lP`DYyDxX&d-r@m8*MynC^QLVnw@y^B*n!p zD3t_Jfu98wi)(6ZY!yvHQwY=id=hte87?NObjdUEJ|=#Gm@uj}5KqoFfjY3sW>K9i ztTv^xG(DX}Oau~UqMiH@5+;{3REvyW*-q4hQk^i2j3u2IsJ6lja7p&EWtnuv>d@?L z3bj|Z90^Nc8PBjCY6u zqgEr69^yxut>CFnK}#gTtMv>mhEcDB(t3W6N{O7~@bCp%jJkvcN|P1RYrclvU0`bq zxV}cK5Q?yXNf(rsL)zDHbObCe0v8u(1ws>cU`s?CGGD3`vP(SpT=Y!tHJzXPvdyLBQFi6A18TI0^l^hQaFLJ{ViA%TvLEL(;LPn8;!I)|6^*RKea z$o#x35u!hyaZ@}-hEKoau%x3)!Z5l@cdXX*VLGXi zkvyE^naG{w>C*-Hk8O?T&$UEey@HRlNMvr#Jsq9Ag1=6}CihWRSf6s7*E+IL>2!f7 zn+)vj=(=1YmzP5%ncu*GWPS;I%x#236vFPHhB4tJ;%anMR(Z1OTOyG!U!;`x)F!dH zY2xh6`Mrja2!Aw>jO6%{vwun=zT#;!A*UaaOzf3N!K!=vR`QS@Hh0@aBJ1nG#zxK_ zI~)&0fE6uxJK^TRtGKyIE7L3l^mDZD*2}K!>}1*b$|FLKtzY?fAwFT7OgHrRo`XDY zZ~N8wc&_Gq9LG5<%C01=XtB3fej4W4`jmGUnnBo_oP#|(icIc)aS+KwYy44q!j`w{ z9z9C1CAse>{?+XnqJY!WG|RztJQt>_;S&wtOW509@AE$3McU^-kaFZgI{W)k)=L~b z9VC(17b(_hMID|`mREUykfCG%DtL>fn!3iZZ4=#2mT`{9m9ue^@*Pk zw-~V`VI2gIA18S0U1u?jUN*<;O^(sNjILh1u7`Mp=jJlL>@6I`0ejFO;z@$2k(Wfg6-(Z<8UKlxZ{1nNJ`+W-In07*qoM6N<$f~+D8s{jB1 literal 0 HcmV?d00001 diff --git a/wgshare/assets/images/3.0x/meeting_main_camera_close.png b/wgshare/assets/images/3.0x/meeting_main_camera_close.png new file mode 100644 index 0000000000000000000000000000000000000000..2f58b76c0311f723d07cb485e192d3b288651883 GIT binary patch literal 1076 zcmV-41k3x0P)EE700009a7bBm001F4 z001F40Y#QEU;qFB0drDELIAGL9O(c600d`2O+f$vv5yPM7i9B&9eX@gG(Gy?C#Eks>)hHRTWH06j*`~;l5ew+}(}fXGM%4NSMAu$lw;I zMM+WYGfsrif3BmYT4{<2U_s?{X-WB;%Sn_Mv3t1O-HpBJ?FE+{QW69~0UvSfITS@= z)-VlQul*byg@4D#TE00RhmV_^@S>#!I9SItk0O2XuA62_ecQ0zh4%{!hM3#)b2wXB z0Zzu*@6?4}Hl_r7>9#l$hYv{OAzkY_)mHn|lu^Fg--pZXZQvxW>QVUVzo%$Qwm7Xh zx!w)0Iy<4YzuzdIZ*3V(m4igB3n+}NL6KQvrzAWl+1=|@T+GQ$@u4Aj+0mip?{043 zWOi0Na`5Q)SToE+rRh3?zn`;#d}sCF?~M)c3iA~SlihsJS8)XS@9o%_QU0^H=f!_! zVF|b2^<5nCx~J!n|86fXTs#4?ru-am2qOX!N09%T+uF1|`R>=`q*MP*=$$#%8u^QR z)DxIE^4*8k)hho{4b~xx!l)w$76IqL1A&Pn$ba#{L8DCGtK+{frhEn*M(J7vDvoF! z7;x-AthGZ^@f~<1aB+myeOs>Eq4H2jHe~XKT|7he=!+&Ov?SMxbB95Su zi`9SB2U?J^_B4UmM6*zt3USjgaRm8~`am5Tz1a9Kg93+H{$aMyK|{q6G-V?>He4J*{xgq1$$vBltOW|p0EfV55l4{!Xbz}Dvv-sK z9{G$%pi^<4qE;z9{{%fC}Hp(|gN3__q z^VBLB>mq1>;v1$@s0_4i#kpDiqG^YDdhZ+LxvHSz)AGEl<#aYum%-(X*a6CqzP?ZY zudnraTL}dwy>5?j?-lqBZjHroRhL$>B<+N%7LxhAr|q$4i!e}QEL%OYD3wM#-|_Pnue`+t4#W(OmLL~$3gqGH=t z#c|4&Q>R#^g($j7mJF?;V%yM^3363&PRxz%(xe8w|sKYukf7lOAxlyV683b@-mybd^r&H{@S%xV)CK$UWM%dFO;LFCqK!s8)wbD z9DmwBXJ`57_@X`z4=+YM1S@<_P(bNDga%B(sJtGspy^^QsgH-{DpvPn1mU2A2<+?Y zix;`7;qOBmD^^5wFHb=sbj zy3#p{pg^k7M_g2Xk`|T{3Z>EN+i*a0mFtOCuA{q~zdT{Rm@!o`{GLDq5hLY8QRZ8^&Cfd;nx zgBRPF!0!=pA5_kqv2kR|!JbB=h@+(Bu6?wRP!cG$jDJBs0uz?SN{sJMt;kdmQJ9z* ziAXJ5ph)I|IL*|u$Lq~cHOls+)rN$J3wt+uY059zd~xve;{SMEJ$u%Z?WuvOv6HSl z0twM3NQg<}sRpJ_pU&fyxfyI}G#qpiE+k-QOgTY|Pc^aG3!0$!4~`O5ZAgw61hiyN zrb#hgPS_JANs6$Wq4yJpM2lDwWqfutNvB$yHf{9q7e-43l~2tf-T(jq07*qoM6N<$ Ef&?o(L;wH) delta 1539 zcmV+e2K@QS38M@liBL{Q4GJ0x0000DNk~Le0000&0000&2nGNE0OM2u=#e2be+9Tn zL_t(|0qvT1}~w7`TI znu-;veI-Uv!@z=s=wCqnE-*Ig0zp;oeIEPV#y`$+VqcOXf21R6@9f%N?tAy#a|aX@ z6ciK`q{YAx5YL`j7#q6^A!cD1f76E*?e-`7cguMEcn1S!ph8Fip3+yVOVb9G1*2MZ zFd#}85TaIlN+N8dy9khNcHL_RL~0=fP^My{59ABk=pB1dVx$s+1em9fbt>EPdur%K z%IHr7A6u-fEJ8C~#|YUAxJ#QIzqaYZrLNc3YH`>0ju1`!`7>kKb`zRNf72s25q%L` zc)i0+yi$mHWEFwonPq%jYp+NYf?kxTwrNGR1y77w9SAM5@7(#NckZKt<(Iw#sI}DhCH9@@8_sqBVbUp_399hb7gRN3YXlCQ}>j&7| z!*QYS5SzqUgEx>mu?-w&7H{6*xQLNyt|A=g$~*GB3KMRmw<;G~d4m z-n|2U|Hi12+v?Ns))Q*0eEkZ%d^xgK$#oent#S=XR(bVmB(0Kre?Ef6aIJFsbo>z8L0E+d4##7woigM0UYGiT!KxmWN&IwDrlo1r>;7PxyCIDbCA-nR;mA45ies*Zca z?c2ch>+$t$6`oN(e#9^tSk4kRZg{;zWt9&fhH8~DWI$%6?{FHPQtHJY{(x`KcY?WKL zlC8o6sc#j^TgGhsSfQVXAVj+zeyCZ>AO)A+Lj0R_3tYI6e>`sd_~BXQ`*%+JZN;>( z0zZ{X4*I13)o0xQ_{4-2Y-H5Y4Hn_y!(^+l7`0l^7Aq@}ZH1wX5t3l92qkOfgS|i+ z*eW+~s(Z)&{$e0=E<`y{FT^KgAe#_EgkRF40n7^gW@^fYI=vU<(xqgp_?h#|m*>M{ z5D8OSEYf60>#LRdI(JulYAPw$8D(yc+j2TEe&*p>g{N6>R@p#CG9L>NtE3-i(p9f5$1vECeIRh3#lXycmboJl#%C zdQ)zz)l}_mx;t(&Gn?4mwV)=|eyoaIgkVSv8!jc+#aPvYmWuv$&&_pxnJA~8$Yg4FU}k)*Lt-|u0k**2B-PsH-ClL zai`o;f2pB57Ub@4PE5?x7{b$|6?>ok{S6AR_*>G(a7Au8q#}1Am;{@2!rk{MAQNJm zUfzUy_uXfSM6}&YyaiX%-&u3pr?83^A(-3_i5%g;J7Crb{GD#IN=mC}6T(Lx9rAMq z{oqinvXm4sNikNTKGx(0bw+qe(1CU#eB3FPf7b_b@k6BXVLY+b%R(x_DoaL}b6f)x zq7xZEaPA-+dn{0CWI10cPw;decXH%mmqdmlgb(!+5%@)`#RtY5WJFqJ9o}cEsWem0 za#Znm+*pvb@x?K|w)5K|#TY@jnK~#7F?V7)D z(@Yr0zYhI{giu+TTt--mkXRTng0a%ufe}PHFaphj6cEA{Y9q0q!q$6qX?Al-Md-vRP2NV<(6ciMs#lR2{ z&z@Nr8@mc2W?>l9hZXJiC;E5Gc>H(=17@H?NCBSGSF20Y29*V)T6HiWN*EBLR(nb! zY@@pfkZpF|YX(GWAp}sSVxkY^3)$!$dr)Ge5`qMnr;l|i+wyyA=tautPXr%ZtgI|T zGhN3B*$cQ!n;pNl>B6P1*Vbxr*Y=JOP5k*YW7u{Rnn=?lHW7UhTX?<0OuSNvd1MuV z;hAN8Tx+jL6oOuqr?zQDwFOU%S>+83;{o!bRJsF=Bnm;@ze#0=zP?a2F{ykbF(Lz+ zw1tWMFokWK&_t@ilEmO{xj;qbQMSrvz$ym^Ch}%-(u5{bPoE@4ojxv7aTHB>JUALR zPMny=F`}n{%J4*BF_NsZ>sqBVbUp_399hb7gRN3YXlCQ}>j&7|!*QYS5SzqUgEx>m zu?-w&7H{6*xQLNyt|A=g$~*GB3KMRmw<;G~d4m-n|2U|Hi12+v?Ns z))Q*0eEkZ%d^xgK$#oent#S=XR(bVmB(0KrK7z$?t#bNw{1p4^muD3&BZR)hOtrd$ zd-s4dXX5L*SMWeOB399xp*njOxO*2ke?Gq6w+fFRLq>n9j(f!I+rahf@%3yKo>4x2 z#4s6H&Js6nc)deql@A|=YLzi$KxU=ya2lRc@by6D!GS|{!3)lv^Tc@j7WnxydP5e0 zqtUrJwVlGx;N>(;DjSsbZlF*4?h$Uj!OKdQDQU7UmY40|olEgccJ2}P@2joCVz5wg zR%y4Jp=a=u!e#KvcX?TzBMbG(G3>i;lpIBuo$&k&=xBzk!^*cj1iJxuLvb;<%7LI8rUi~Z>oF8{{CVhb1pNtN5Ao%a`ZFV-h_}9T~_b#L1HlLRdI(JulYAPw$8D(yc z+j2TEe&*p>g{N6>R@p#CG9L>NtE3-i(p9$0^7x1S7|V?Px{37>Ct7-A+z=Q*Nu(RPAlLJ8m;Go7mm8 zpeEIRtcqNOU`PxbF*{!12dq~6en5F|FM{NydvYG5PNiZb1#${<6M~@!uG2@{9;HKT zj|Jn&lLmUZU)%{BKdw+O&KxS&dbLWfLNFu-r}^VIe}&j_r`%Ghp*j}i?r%;^%+nac z)1wu8pZ)y}3b6QF(#CK_ZaJhPcOjSrn{>k6_b4C}VwzswgnIYgXNg3#-AlX$SJK~E zbK9q|iWVW5+zyEx;lMj!)(HHaZnH{Ct7sF#M;;yWa|Zq3P^_|)6fj9KR-r!D@nJl%)yqOE!758emvdYL6QUCtKXC3K9D6KKX=FKHDNpcp z9(Qu&VV6XPB7_h15)t@CtHlS#9ArdVWgXsUs;M+n&T>@ocidQzwDH8?ve-kQm!Rse z7NQplAtYJ{OLuk{A6Fk)rfq=W1)}1fvJJy&{IRheou~En3Q?==BG1UO)w-zb7_v5N zxGTr}M1XrQFZR%azA@s|sU75x15N0)hPU^yh^!b!le5&6?b<>?K|w)5K|#TY@jn>){hWS>h;bS zy+>Gs_*NkLQ=;qRAn>-5DWNHaJjQ7$2twGFSh!Qn01$98F*$k>H2?qr07*qoM6N<$ Eg0zyTo&W#< literal 0 HcmV?d00001 diff --git a/wgshare/assets/images/meeting_main_microphone_close.png b/wgshare/assets/images/meeting_main_microphone_close.png index da1509551e75387159e57c548ba15d7bbed0ce84..887d31f01875848f7a0667fad2494bf38860ee11 100644 GIT binary patch delta 405 zcmV;G0c!s11ik|yiBL{Q4GJ0x0000DNk~Le0000I0000H2nGNE0MJ_e`H>+se*sfT zL_t(|0kxFDPQpMChG(ib4*Cf74eA?Icmd8_46}WEw#&taf zvB{S5TY&;=WvzXO7UBs39eTeYe=9C@RCK?C4ren#p>zQ8>OIRG&3xMkq+ouIc%Ah7 zrN=M=eLC~J{Wu<{55pn+Ta?fyC-o(c#a*KzUz4PeZ`oEwuuVW*9hVo~4+fH9Z&|hi zvES!06A@)4ir^Ru!wCRc=`xD0DGb{vx(QH!KtaI_+1)s%bAWD?Tz7A)%&{vvfW zQ8a1^FQ`@*d?(lE@0Nimp-r8iAp93dVO#nDHh=O5oS1T*00000NkvXXu0mjf4>+*_ delta 580 zcmV-K0=xab1M37KiBL{Q4GJ0x0000DNk~Le0000M0000M2nGNE0K~LxJCPwYe*yqW zL_t(|0o9bhPQp+W#=l$f--b_M^#w#N5w_@AV7|UpkBu$rVUOIZVRsz zhJrpk0F?^`!f$bSn8v~a@bTe|W)uGcyH{7RBiNpP#_uBCxX~lkK71wh@UG+1D%VYip!pVHmRUZSHzPoSl`> z>FMol;Pe!#G%qheDz%B3nSHrF2n_@)bDTT&Z_@wGEuOe%H7{E)nJm+LgWTYonqJ$bEmFf#te+Q>fctyD!_5Vno*8Eto3eIG7D!+xM?Gj#9cZ6p;N1StI zJU*JRteih*5|$nd?k2dtmd89n@TUI<@AUJ2{pD34p*fWdSn0cG!Wa|eIZ8vy!OxzsACqNTdqg_nI!4jhk4)|x&0o+a0#1R7w?7V@M7oZ6X z477gtwh+Jq6(>$|+mm~He&_4C=U!miOpN=$HO(mI=a1>`!*y*4QAMj|2-CDj#YOrc zK#s38vsvBAxw#^rF;9ll5o02q@2yc_tp_TD6C7XkPt@GyWt^~BKwR9-Wa0>;m|Cg? zuG5tYv-H={XnbR7DLB$`bc9jt!!3C5JII@-@*o<*=&@`WOS#U zit1S?0H2@0;v%rKBa`i+-L?^l6xr7+>}zYJVqqAv@onyULY$qI(CO*zZQ%42sx&Vz zKq|F~nVEgLJ_rp2D|4JX_HWYv%`Kj|XEiTdFPSXUdxPBIo0}wRwKs$*MNc_o38I7= zB9-b3RtKk0ctyD!_5Vno*8Eto3eIG7D!+xM?Gj#9cZ6p;N1StIJU*JRteih*5|$nd z?k2dtmd89n@TUI<@AUJ2{pD34p*fWdSn0cG!Wa|eIZ8v<3|TxLxMfOD_Nb002ovPDHLk FV1g8&5kmj~ literal 0 HcmV?d00001 diff --git a/wgshare/lib/common/api/retrofit_client.dart b/wgshare/lib/common/api/retrofit_client.dart index 2e42689..b3a6e48 100644 --- a/wgshare/lib/common/api/retrofit_client.dart +++ b/wgshare/lib/common/api/retrofit_client.dart @@ -2,7 +2,9 @@ import 'package:dio/dio.dart' hide Headers; import 'package:retrofit/retrofit.dart'; import '../models/common/base_structure_result.dart'; +import '../models/meeting_room_info.dart'; import '../models/meeting_room_item.dart'; +import '../models/meeting_room_user.dart'; import '../models/user_info_entity.dart'; part 'retrofit_client.g.dart'; @@ -33,4 +35,22 @@ abstract class RetrofitClient { @Query("PageIndex") int PageIndex, @Query("PageSize") int PageSize, ); + + /// 获取会议室信息 + @GET("/room/{roomNum}") + Future> getMeetingRoomInfo( + @Path("roomNum") String roomNum, + ); + + /// 获取会议室所有用户 + @GET("/room/user") + Future>> getMeetingRoomAllUser( + @Query("roomNum") String roomNum, + ); + + /// 获取会议室Token + @GET("/room/tk/rtc") + Future> getMeetingToken( + @Query("roomNum") String roomNum, + ); } diff --git a/wgshare/lib/common/models/meeting_room_info.dart b/wgshare/lib/common/models/meeting_room_info.dart new file mode 100644 index 0000000..2669437 --- /dev/null +++ b/wgshare/lib/common/models/meeting_room_info.dart @@ -0,0 +1,32 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'meeting_room_info.g.dart'; + +@JsonSerializable() +class MeetingRoomInfo extends Object{ + + @JsonKey(name: 'id') + String id; + + @JsonKey(name: 'roomName') + String roomName; + + @JsonKey(name: 'roomNum') + String roomNum; + + @JsonKey(name: 'onlineUserCount') + int onlineUserCount; + + @JsonKey(name: 'year') + int year; + + @JsonKey(name: 'subject') + int subject; + + MeetingRoomInfo(this.id,this.roomName,this.roomNum,this.onlineUserCount,this.year,this.subject,); + + factory MeetingRoomInfo.fromJson(Map srcJson) => _$MeetingRoomInfoFromJson(srcJson); + +} + + diff --git a/wgshare/lib/common/models/meeting_room_user.dart b/wgshare/lib/common/models/meeting_room_user.dart new file mode 100644 index 0000000..cb810de --- /dev/null +++ b/wgshare/lib/common/models/meeting_room_user.dart @@ -0,0 +1,45 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'meeting_room_user.g.dart'; + + +@JsonSerializable() +class MeetingRoomUser extends Object{ + + @JsonKey(name: 'uid') + String uid; + + @JsonKey(name: 'connectId') + String connectId; + + @JsonKey(name: 'account') + String account; + + @JsonKey(name: 'enableMicr') + bool enableMicr; + + @JsonKey(name: 'enableCamera') + bool enableCamera; + + @JsonKey(name: 'screenShareId') + String screenShareId; + + @JsonKey(name: 'userName') + String userName; + + @JsonKey(name: 'roleId') + String roleId; + + @JsonKey(name: 'roleName') + String roleName; + + @JsonKey(name: 'isRoomManager') + bool isRoomManager; + + MeetingRoomUser(this.uid,this.connectId,this.account,this.enableMicr,this.enableCamera,this.screenShareId,this.userName,this.roleId,this.roleName,this.isRoomManager,); + + factory MeetingRoomUser.fromJson(Map srcJson) => _$MeetingRoomUserFromJson(srcJson); + +} + + diff --git a/wgshare/lib/pages/homePage/home_view.dart b/wgshare/lib/pages/homePage/home_view.dart index 8688390..2f9284e 100644 --- a/wgshare/lib/pages/homePage/home_view.dart +++ b/wgshare/lib/pages/homePage/home_view.dart @@ -169,7 +169,7 @@ class HomePageState extends State with AutomaticKeepAliveClientMixin { ), ), onTap: (){ - Get.toNamed(Routes.meetingMainPage); + Get.toNamed(Routes.meetingMainPage, arguments: {"roomNumber": state.meetingRooms[index].roomNum}); }, ) ], diff --git a/wgshare/lib/pages/loginPage/login_logic.dart b/wgshare/lib/pages/loginPage/login_logic.dart index 24b2b8a..32e5bc4 100644 --- a/wgshare/lib/pages/loginPage/login_logic.dart +++ b/wgshare/lib/pages/loginPage/login_logic.dart @@ -62,7 +62,7 @@ class LoginLogic extends GetxController with RequestToolMixin { if (null != res.data) { UserStore.to.setToken(res.data!.token); UserStore.to.setUserDetailInfo(res.data!); - Get.toNamed(Routes.meetingMainPage); + Get.toNamed(Routes.meetingMainPage, arguments: {"roomNumber": state.meetingCodeController.text}); } } } diff --git a/wgshare/lib/pages/metting/meeting_main_logic.dart b/wgshare/lib/pages/metting/meeting_main_logic.dart index d2959b7..3c1ef0e 100644 --- a/wgshare/lib/pages/metting/meeting_main_logic.dart +++ b/wgshare/lib/pages/metting/meeting_main_logic.dart @@ -1,10 +1,78 @@ -import 'package:get/get.dart'; +import 'dart:async'; +import 'package:get/get.dart'; +import 'package:signalr_core/signalr_core.dart'; +import 'package:wgshare/common/store/user_store.dart'; + +import '../../common/config/request_config.dart'; +import '../../common/mixins/request_tool_mixin.dart'; +import '../../common/models/common/base_structure_result.dart'; +import '../../common/models/meeting_room_info.dart'; +import '../../common/models/meeting_room_user.dart'; +import '../../utils/toast_utils.dart'; import 'meeting_main_state.dart'; -class MeetingMainLogic extends GetxController { +class MeetingMainLogic extends GetxController with RequestToolMixin{ final MeetingMainState state = MeetingMainState(); + @override + void onInit() async { + super.onInit(); + + // 接收参数 + var data = Get.arguments; + state.roomNumber.value = data["roomNumber"]; + + signalRSocket(); + } + + @override + void onClose() { + super.onClose(); + state.memberNameSearchController.dispose(); + stopTime(); + state.hubConnection.value?.stop(); + } + + /// 合并请求 + /// 1.获取会议室信息 + /// 2.获取会议室所有用户 + /// 3.获取会议室Token + void mergeFetch() async { + ToastUtils.showLoading(); + + var results = await Future.wait([ + getClient().getMeetingRoomInfo(state.roomNumber.value), + getClient().getMeetingRoomAllUser(state.roomNumber.value), + getClient().getMeetingToken(state.roomNumber.value)]); + + doHttpGetMeetingRoomInfo(results[0].data as MeetingRoomInfo); + doHttpGetMeetingRoomAllUser(results[1].data as List); + doHttpGetMeetingToken(results[2].data as String); + + ToastUtils.dismiss(); + } + + /// Socket长连接 + Future signalRSocket() async { + state.hubConnection.value = HubConnectionBuilder().withUrl('${RequestConfig().baseUrl}/session-manage', + HttpConnectionOptions( + transport: HttpTransportType.longPolling, + accessTokenFactory: () async => await Future.value(UserStore.to.token), + logging: (level, message) => print("SignalR Socket:$message"), + )).build(); + + await state.hubConnection.value?.start(); + + joinChannel(); + } + + /// 加入会议室 + void joinChannel() async { + await state.hubConnection.value?.invoke("joinChannel", args: [state.roomNumber.value, false, false, false]); + mergeFetch(); + } + /// 改变会议信息浮层显示状态 void changeMeetingInfoState(bool isShow){ state.isShowMeetingInfoFloatingLayer.value = isShow; @@ -19,4 +87,58 @@ class MeetingMainLogic extends GetxController { void changePageState(int pageState){ state.pageState.value = pageState; } + + /// 获取会议室信息 + void doHttpGetMeetingRoomInfo(MeetingRoomInfo meetingRoomInfo) async { + state.meetingRoomInfo.value = meetingRoomInfo; + startTime(); + } + + /// 获取会议室所有用户 + void doHttpGetMeetingRoomAllUser(List meetingRoomUsers) async { + state.users.value = meetingRoomUsers; + state.cacheUsers.value = meetingRoomUsers; + } + + /// 获取会议室Token + void doHttpGetMeetingToken(String meetingToken) async { + state.meetingToken.value = meetingToken; + } + + /// 启动计时 + void startTime(){ + state.stopwatch.value.start(); + state.timer.value = Timer.periodic(const Duration(milliseconds: 100), upTime); + } + + /// 更新计时 + void upTime(Timer t) { + if(state.stopwatch.value.isRunning){ + state.duration.value = + "${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")}"; + } + } + + /// 停止计时 + void stopTime() { + state.timer.value?.cancel(); + state.stopwatch.value.stop(); + } + + /// 搜索成员 + void searchMember(String value){ + if(value.isNotEmpty){ + List memberSearchList = []; + for(var i = 0; i < state.cacheUsers.length; i++){ + if(state.cacheUsers[i].userName.contains(value)){ + memberSearchList.add(state.cacheUsers.value[i]); + } + } + state.users.value = memberSearchList; + }else{ + state.users.value = state.cacheUsers.value; + } + } } diff --git a/wgshare/lib/pages/metting/meeting_main_state.dart b/wgshare/lib/pages/metting/meeting_main_state.dart index 4bf9e11..4e280c2 100644 --- a/wgshare/lib/pages/metting/meeting_main_state.dart +++ b/wgshare/lib/pages/metting/meeting_main_state.dart @@ -1,12 +1,21 @@ +import 'dart:async'; + import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart'; +import 'package:signalr_core/signalr_core.dart'; + +import '../../common/models/meeting_room_info.dart'; +import '../../common/models/meeting_room_user.dart'; class MeetingMainState { + MeetingMainState() { ///Initialize variables } + late TextEditingController memberNameSearchController = TextEditingController(); + /// 是否显示会议信息浮层 late RxBool isShowMeetingInfoFloatingLayer = false.obs; @@ -18,4 +27,28 @@ class MeetingMainState { /// 当前页面状态,0:语音,1:视频,2,共享 late RxInt pageState = 0.obs; + + /// 会议室编号 + late RxString roomNumber = "".obs; + + /// 会议室信息 + late Rx meetingRoomInfo = Rx(null); + + /// 会议室计时相关 + late RxString duration = "".obs; + late Rx stopwatch = Rx(Stopwatch()); + late Rx timer = Rx(null); + + /// Http接口获取的会议室所有用户 + late RxList users = RxList([]); + + /// 搜索用户时,缓存会议室所有用户原始数据 + late RxList cacheUsers = RxList([]); + + /// 会议室Token + late RxString meetingToken = "".obs; + + /// signalR 长连接相关 + late RxString serviceUrl = "http://192.168.2.9:5192/session-manage".obs; + late Rx hubConnection = Rx(null); } diff --git a/wgshare/lib/pages/metting/meeting_main_view.dart b/wgshare/lib/pages/metting/meeting_main_view.dart index df8244c..38dae84 100644 --- a/wgshare/lib/pages/metting/meeting_main_view.dart +++ b/wgshare/lib/pages/metting/meeting_main_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.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'; @@ -33,7 +34,7 @@ class MeetingMainPage extends StatelessWidget { ), backgroundColor: ColorUtil.Color_41_41_41, ), - body: Stack( + body: Obx(() => Stack( children: [ Column( children: [ @@ -87,7 +88,7 @@ class MeetingMainPage extends StatelessWidget { Row( children: [ Text( - '高三教研数学组', + state.meetingRoomInfo.value?.roomName ?? '', style: TextStyle( color: Colors.white, fontSize: 14.sp, @@ -103,7 +104,7 @@ class MeetingMainPage extends StatelessWidget { ), SizedBox(height: 4.h), Text( - '08:50', + state.duration.value, style: TextStyle( color: Colors.white, fontSize: 12.sp, @@ -127,7 +128,7 @@ class MeetingMainPage extends StatelessWidget { ), onTap: () { Get.bottomSheet( - isScrollControlled: true, + isScrollControlled: true, leaveBottomSheet(context) ); }, @@ -145,7 +146,7 @@ class MeetingMainPage extends StatelessWidget { // 语音 Visibility( visible: true, - child: MeetingMainVoiceComponent() + child: MeetingMainVoiceComponent(users: state.cacheUsers.value) ), // 视频 @@ -198,7 +199,7 @@ class MeetingMainPage extends StatelessWidget { ), onTap: () { Get.bottomSheet( - isScrollControlled: true, + isScrollControlled: true, chatBottomSheet(context) ); Future.delayed(const Duration(milliseconds: 100), () { @@ -240,7 +241,7 @@ class MeetingMainPage extends StatelessWidget { ), onTap: () { Get.bottomSheet( - isScrollControlled: true, + isScrollControlled: true, applySpeakPermissionBottomSheet( context) ); @@ -317,7 +318,7 @@ class MeetingMainPage extends StatelessWidget { onTap: () { Get.bottomSheet( isScrollControlled: true, - queryMemberFloatingLayer(context) + Obx(() => queryMemberFloatingLayer(context)), ); }, ), @@ -351,7 +352,7 @@ class MeetingMainPage extends StatelessWidget { meetingInfoFloatingLayer(), meetingAudioFloatingLayer(), ], - )); + ))); } @override @@ -416,7 +417,7 @@ class MeetingMainPage extends StatelessWidget { /// 会议信息浮层 Widget meetingInfoFloatingLayer() { - return Obx(() => Visibility( + return Visibility( visible: state.isShowMeetingInfoFloatingLayer.value, child: Column( children: [ @@ -436,7 +437,7 @@ class MeetingMainPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '高三教研数学组', + state.meetingRoomInfo.value?.roomName ?? '', style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w500, @@ -476,7 +477,7 @@ class MeetingMainPage extends StatelessWidget { Row( children: [ Text( - '561564899156', + state.roomNumber.value, style: TextStyle( fontSize: 12.sp, color: ColorUtil.Color_202_202_202, @@ -499,62 +500,6 @@ class MeetingMainPage extends StatelessWidget { color: ColorUtil.Color_49_47_47, margin: const EdgeInsets.only(top: 14, bottom: 14), ), - Container( - padding: const EdgeInsets.only(left: 16, right: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - '密码', - style: TextStyle( - fontSize: 12.sp, - fontWeight: FontWeight.w500, - color: ColorUtil.Color_134_134_134), - ), - Text( - '5615648', - style: TextStyle( - fontSize: 12.sp, - color: ColorUtil.Color_202_202_202, - fontWeight: FontWeight.w500), - ) - ], - ), - ), - Container( - width: double.infinity, - height: 1.h, - color: ColorUtil.Color_49_47_47, - margin: const EdgeInsets.only(top: 14, bottom: 14), - ), - Container( - padding: const EdgeInsets.only(left: 16, right: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - '发起人', - style: TextStyle( - fontSize: 12.sp, - fontWeight: FontWeight.w500, - color: ColorUtil.Color_134_134_134), - ), - Text( - '晓晓', - style: TextStyle( - fontSize: 12.sp, - color: ColorUtil.Color_202_202_202, - fontWeight: FontWeight.w500), - ) - ], - ), - ), - Container( - width: double.infinity, - height: 1.h, - color: ColorUtil.Color_49_47_47, - margin: const EdgeInsets.only(top: 14, bottom: 14), - ), Container( padding: const EdgeInsets.only(left: 16, right: 16), child: Row( @@ -568,7 +513,7 @@ class MeetingMainPage extends StatelessWidget { color: ColorUtil.Color_134_134_134), ), Text( - '晓晓', + UserStore.to.userInfoEntity.value!.userName, style: TextStyle( fontSize: 12.sp, color: ColorUtil.Color_202_202_202, @@ -596,7 +541,7 @@ class MeetingMainPage extends StatelessWidget { color: ColorUtil.Color_134_134_134), ), Text( - '08:50', + state.duration.value, style: TextStyle( fontSize: 12.sp, color: ColorUtil.Color_202_202_202, @@ -641,12 +586,12 @@ class MeetingMainPage extends StatelessWidget { )) ], ), - )); + ); } /// 选择音频输出浮层 Widget meetingAudioFloatingLayer() { - return Obx(() => Visibility( + return Visibility( visible: state.isShowMeetingAudioFloatingLayer.value, child: Column( children: [ @@ -676,7 +621,7 @@ class MeetingMainPage extends StatelessWidget { )) ], ), - )); + ); } /// 音频列表 @@ -897,17 +842,22 @@ class MeetingMainPage extends StatelessWidget { SizedBox(width: 8.w), Expanded( child: TextField( + controller: state.memberNameSearchController, style: TextStyle( fontSize: 14.sp, color: ColorUtil.Color_235_235_235 ), + textInputAction: TextInputAction.search, decoration: InputDecoration( - contentPadding: EdgeInsets.all(0), - border: OutlineInputBorder(borderSide: BorderSide.none), + contentPadding: const EdgeInsets.all(0), + border: const OutlineInputBorder(borderSide: BorderSide.none), hintText: '输入用户名', hintStyle: TextStyle( color: ColorUtil.Color_70_71_73, fontSize: 14.sp)), + onSubmitted: (value){ + logic.searchMember(value); + }, ), ) ], @@ -917,7 +867,7 @@ class MeetingMainPage extends StatelessWidget { margin: const EdgeInsets.only(top: 18, left: 16, right: 16, bottom: 16), child: Text( - '会议中(2)', + '会议中(${state.users.length})', style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w500, @@ -944,31 +894,39 @@ class MeetingMainPage extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(100), - image: DecorationImage( - fit: BoxFit.cover, - image: NetworkImage( - "https://ts4.cn.mm.bing.net/th?id=OIP-C.QDl_Z7HdQWX_XbVYgBLJLQAAAA&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2", - ), - ), + color: ColorUtil.Color_85_117_242 ), margin: const EdgeInsets.only(right: 8), width: 36.w, height: 36.h, + alignment: Alignment.center, + child: Text( + state.users[index].userName.length >= 3 + ? state.users[index].userName.substring(1,state.users[index].userName.length) + : state.users[index].userName, + style: TextStyle( + fontSize: 12.sp, + color: ColorUtil.Color_244_244_244 + ), + ), ), Text( - '晓晓', + state.users[index].userName, style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w600, color: ColorUtil.Color_243_243_243), ), SizedBox(width: 8.w), - Text( - '主持人', - style: TextStyle( - fontSize: 12.sp, - fontWeight: FontWeight.w500, - color: ColorUtil.Color_2_177_136), + Visibility( + child: Text( + '主持人', + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w500, + color: ColorUtil.Color_2_177_136), + ), + visible: state.users[index].isRoomManager, ) ], ), @@ -984,7 +942,7 @@ class MeetingMainPage extends StatelessWidget { Container( margin: const EdgeInsets.only(left: 12), child: Image.asset( - 'assets/images/meeting_main_microphone_default.png', + state.users[index].enableMicr == true ? 'assets/images/meeting_main_microphone_default.png' : 'assets/images/meeting_main_microphone_close.png', width: 17.w, height: 17.h, ), @@ -992,7 +950,7 @@ class MeetingMainPage extends StatelessWidget { Container( margin: const EdgeInsets.only(left: 12), child: Image.asset( - 'assets/images/meeting_main_camera_default.png', + state.users[index].enableCamera == true ? 'assets/images/meeting_main_camera_default.png' : 'assets/images/meeting_main_camera_close.png', width: 17.w, height: 17.h, ), @@ -1012,7 +970,7 @@ class MeetingMainPage extends StatelessWidget { ), ); }, - itemCount: 10, + itemCount: state.users.length, ) ), ) diff --git a/wgshare/lib/pages/metting/share/meeting_main_share_view.dart b/wgshare/lib/pages/metting/share/meeting_main_share_view.dart index 903b601..73fa189 100644 --- a/wgshare/lib/pages/metting/share/meeting_main_share_view.dart +++ b/wgshare/lib/pages/metting/share/meeting_main_share_view.dart @@ -105,7 +105,7 @@ class MeetingMainShareComponent extends StatelessWidget { child: Row( children: [ Image.asset( - 'assets/images/meeting_main_microphone_close.png', + 'assets/images/meeting_main_microphone_open.png', width: 13.w, height: 14.h, ), diff --git a/wgshare/lib/pages/metting/video/meeting_main_video_view.dart b/wgshare/lib/pages/metting/video/meeting_main_video_view.dart index 018ffc9..54cdcfe 100644 --- a/wgshare/lib/pages/metting/video/meeting_main_video_view.dart +++ b/wgshare/lib/pages/metting/video/meeting_main_video_view.dart @@ -123,7 +123,7 @@ class MeetingMainVideoComponent extends StatelessWidget { child: Row( children: [ Image.asset( - 'assets/images/meeting_main_microphone_close.png', + 'assets/images/meeting_main_microphone_open.png', width: 13.w, height: 14.h, ), @@ -189,7 +189,7 @@ class MeetingMainVideoComponent extends StatelessWidget { child: Row( children: [ Image.asset( - 'assets/images/meeting_main_microphone_close.png', + 'assets/images/meeting_main_microphone_open.png', width: 13.w, height: 14.h, ), diff --git a/wgshare/lib/pages/metting/voice/meeting_main_voice_view.dart b/wgshare/lib/pages/metting/voice/meeting_main_voice_view.dart index 06b21f7..002e564 100644 --- a/wgshare/lib/pages/metting/voice/meeting_main_voice_view.dart +++ b/wgshare/lib/pages/metting/voice/meeting_main_voice_view.dart @@ -2,13 +2,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import '../../../common/models/meeting_room_user.dart'; import '../../../utils/color_util.dart'; import '../../../utils/cus_behavior.dart'; import 'meeting_main_voice_logic.dart'; import 'meeting_main_voice_state.dart'; class MeetingMainVoiceComponent extends StatelessWidget { - MeetingMainVoiceComponent({Key? key}) : super(key: key); + MeetingMainVoiceComponent({Key? key, required this.users}) : super(key: key); + + final List users; final MeetingMainVoiceLogic logic = Get.put(MeetingMainVoiceLogic()); final MeetingMainVoiceState state = Get.find().state; @@ -27,7 +30,7 @@ class MeetingMainVoiceComponent extends StatelessWidget { crossAxisCount: 3, childAspectRatio: 0.7, crossAxisSpacing: 20), - itemCount: 15, + itemCount: users.length, itemBuilder: (BuildContext ctx, index) { return Column( children: [ @@ -35,27 +38,32 @@ class MeetingMainVoiceComponent extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(99), - image: DecorationImage( - fit: BoxFit.cover, - image: NetworkImage( - "https://ts4.cn.mm.bing.net/th?id=OIP-C.QDl_Z7HdQWX_XbVYgBLJLQAAAA&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2", - ), - ), + color: ColorUtil.Color_85_117_242 ), width: 76.w, height: 76.h, + alignment: Alignment.center, + child: Text( + users[index].userName.length >= 3 + ? users[index].userName.substring(1,users[index].userName.length) + : users[index].userName, + style: TextStyle( + fontSize: 22.sp, + color: ColorUtil.Color_244_244_244 + ), + ), ), SizedBox(height: 6.h), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( - 'assets/images/meeting_main_speak1.png', + users[index].enableMicr == true ? 'assets/images/meeting_main_speak1.png' : 'assets/images/meeting_main_microphone_open.png', width: 22.w, height: 22.h, ), Text( - '张三啊', + users[index].userName, style: TextStyle( fontSize: 12.sp, color: ColorUtil.Color_255_255_255), diff --git a/wgshare/lib/pages/userPage/user_view.dart b/wgshare/lib/pages/userPage/user_view.dart index 15e9aa8..713c55e 100644 --- a/wgshare/lib/pages/userPage/user_view.dart +++ b/wgshare/lib/pages/userPage/user_view.dart @@ -70,12 +70,6 @@ class UserPageState extends State { decoration: BoxDecoration( borderRadius: BorderRadius.circular(100), color: ColorUtil.Color_85_117_242 - /*image: DecorationImage( - fit: BoxFit.cover, - image: NetworkImage( - "https://ts4.cn.mm.bing.net/th?id=OIP-C.QDl_Z7HdQWX_XbVYgBLJLQAAAA&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2", - ), - ),*/ ), width: 132.w, height: 132.h, @@ -91,14 +85,12 @@ class UserPageState extends State { ), ), ), - Container( - child: Text( - UserStore.to.userInfoEntity.value!.userName, - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w500, - color: ColorUtil.Color_85_117_242 - ), + Text( + UserStore.to.userInfoEntity.value!.userName, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w500, + color: ColorUtil.Color_85_117_242 ), ), Container( diff --git a/wgshare/macos/Flutter/GeneratedPluginRegistrant.swift b/wgshare/macos/Flutter/GeneratedPluginRegistrant.swift index 731e795..6cdef6b 100644 --- a/wgshare/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/wgshare/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,15 +5,19 @@ import FlutterMacOS import Foundation +import agora_rtc_engine import device_info_plus import geolocator_apple +import iris_method_channel import package_info_plus import path_provider_foundation import sqflite_darwin func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AgoraRtcNgPlugin.register(with: registry.registrar(forPlugin: "AgoraRtcNgPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) + IrisMethodChannelPlugin.register(with: registry.registrar(forPlugin: "IrisMethodChannelPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) diff --git a/wgshare/pubspec.lock b/wgshare/pubspec.lock index 362582a..ee40c95 100644 --- a/wgshare/pubspec.lock +++ b/wgshare/pubspec.lock @@ -14,6 +14,14 @@ packages: description: dart source: sdk version: "0.3.2" + agora_rtc_engine: + dependency: "direct main" + description: + name: agora_rtc_engine + sha256: deefb5ea051c4d916552cbf76cfbdd652867aa9b554ff9afb3c732ec2e44652e + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.3.2" analyzer: dependency: transitive description: @@ -114,26 +122,26 @@ packages: dependency: "direct main" description: name: cached_network_image - sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" + sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" url: "https://pub.flutter-io.cn" source: hosted - version: "3.4.1" + version: "3.3.1" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" + sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" url: "https://pub.flutter-io.cn" source: hosted - version: "4.1.1" + version: "4.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" + sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7" url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.1" + version: "1.2.0" characters: dependency: transitive description: @@ -210,10 +218,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: f545ffbadee826f26f2e1a0f0cbd667ae9a6011cc0f77c0f8f00a969655e6e95 + sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 url: "https://pub.flutter-io.cn" source: hosted - version: "11.1.1" + version: "10.1.2" device_info_plus_platform_interface: dependency: transitive description: @@ -246,6 +254,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.0.3" + equatable: + dependency: transitive + description: + name: equatable + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.7" fake_async: dependency: transitive description: @@ -287,10 +303,10 @@ packages: dependency: transitive description: name: flutter_cache_manager - sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" url: "https://pub.flutter-io.cn" source: hosted - version: "3.4.1" + version: "3.3.1" flutter_easyloading: dependency: "direct main" description: @@ -478,10 +494,10 @@ packages: dependency: transitive description: name: http - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.2" + version: "0.13.6" http_multi_server: dependency: transitive description: @@ -514,6 +530,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.0.4" + iris_method_channel: + dependency: transitive + description: + name: iris_method_channel + sha256: "131d0a40ba646ba8fd4bf76e24d4ebd4aa3174ee39aa5fe8240c3b827979052c" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.1" js: dependency: transitive description: @@ -854,10 +878,10 @@ packages: dependency: transitive description: name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" url: "https://pub.flutter-io.cn" source: hosted - version: "0.28.0" + version: "0.27.7" shelf: dependency: transitive description: @@ -874,6 +898,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" + signalr_core: + dependency: "direct main" + description: + name: signalr_core + sha256: dca676372a00c051511591ed0e24521ff7aa4e9320a7fa778a1007f7f522c8c0 + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.1" sky_engine: dependency: transitive description: flutter @@ -951,6 +983,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" + sse_client: + dependency: transitive + description: + name: sse_client + sha256: "71bd826430b41ab20a69d85bf2dfe9f11cfe222938e681ada1aea71fc8adf348" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.0" stack_trace: dependency: transitive description: @@ -1023,6 +1063,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" + tuple: + dependency: transitive + description: + name: tuple + sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.2" typed_data: dependency: transitive description: @@ -1071,22 +1119,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "2.4.0" win32: dependency: transitive description: diff --git a/wgshare/pubspec.yaml b/wgshare/pubspec.yaml index 992b9c4..0a4152c 100644 --- a/wgshare/pubspec.yaml +++ b/wgshare/pubspec.yaml @@ -57,7 +57,7 @@ dependencies: easy_debounce: ^2.0.3 # 防抖节流 # loading插件 flutter_easyloading: ^3.0.5 - cached_network_image: ^3.4.1 + cached_network_image: ^3.3.1 package_info_plus: ^8.1.1 fluttertoast: ^8.2.8 functional_widget_annotation: ^0.10.0 @@ -67,7 +67,14 @@ dependencies: # MD5加密 crypto: ^3.0.2 - device_info_plus: ^11.1.1 + # 获取设备信息 + device_info_plus: ^10.0.0 + + # 声网 Flutter SDK 依赖项,请使用最新版本的 agora_rtc_engine + agora_rtc_engine: ^6.3.2 + + # .net socket通信插件 + signalr_core: ^1.1.1 dev_dependencies: flutter_test: diff --git a/wgshare/windows/flutter/generated_plugin_registrant.cc b/wgshare/windows/flutter/generated_plugin_registrant.cc index 5be7b60..b495d7a 100644 --- a/wgshare/windows/flutter/generated_plugin_registrant.cc +++ b/wgshare/windows/flutter/generated_plugin_registrant.cc @@ -6,12 +6,18 @@ #include "generated_plugin_registrant.h" +#include #include +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + AgoraRtcEnginePluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AgoraRtcEnginePlugin")); GeolocatorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("GeolocatorWindows")); + IrisMethodChannelPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("IrisMethodChannelPluginCApi")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/wgshare/windows/flutter/generated_plugins.cmake b/wgshare/windows/flutter/generated_plugins.cmake index b949ced..4e8db44 100644 --- a/wgshare/windows/flutter/generated_plugins.cmake +++ b/wgshare/windows/flutter/generated_plugins.cmake @@ -3,7 +3,9 @@ # list(APPEND FLUTTER_PLUGIN_LIST + agora_rtc_engine geolocator_windows + iris_method_channel permission_handler_windows )