import 'package:app/request/dto/room/room_user_dto.dart'; import 'package:app/widgets/room/file_drawer.dart'; import 'package:app/widgets/room/video_surface.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:remixicon/remixicon.dart'; import '../viewmodel/students_view_model.dart'; class StudentItem extends StatefulWidget { final RoomUserDto user; const StudentItem({ super.key, required this.user, }); @override State createState() => _StudentItemState(); } class _StudentItemState extends State { ///打开文件列表 void _openFileList() { showFileDialog(context, isUpload: false); } @override Widget build(BuildContext context) { final vm = context.read(); //摄像头是否开启 bool isCameraOpen = widget.user.cameraStatus == 1; ///麦克风是否开启 bool isMicOpen = widget.user.microphoneStatus == 1; return ClipRRect( borderRadius: BorderRadius.circular(10), child: Container( color: Color(0xFF404649), child: Column( children: [ Expanded( child: SizedBox( width: double.infinity, child: Stack( children: [ // VideoSurface(), Positioned( bottom: 0, left: 0, right: 0, child: Container( padding: EdgeInsets.symmetric(horizontal: 10, vertical: 8), decoration: BoxDecoration( gradient: LinearGradient( colors: [Color(0x0b050505), Color(0x54050505)], begin: Alignment.topCenter, end: Alignment.bottomCenter, ), ), child: Text( widget.user.userName, style: TextStyle(color: Colors.white, fontSize: 14), ), ), ), if (widget.user.userId != vm.activeSId) Positioned( right: 5, top: 5, child: InkWell( onTap: () { vm.selectStudent(widget.user.userId); }, child: Container( width: 25, height: 25, alignment: Alignment.center, decoration: BoxDecoration( color: Colors.black12, borderRadius: BorderRadius.circular(5), ), child: Icon(RemixIcons.fullscreen_line, color: Colors.white), ), ), ), ], ), ), ), ColoredBox( color: Color(0xFF232426), child: Row( children: [ _actionItem( icon: isCameraOpen ? RemixIcons.video_on_fill : RemixIcons.video_off_fill, isActive: isCameraOpen, ), _actionItem( icon: isMicOpen ? RemixIcons.mic_fill : RemixIcons.mic_off_fill, isActive: isMicOpen, ), // _actionItem( // icon: RemixIcons.volume_mute_fill, // ), _actionItem(icon: RemixIcons.file_list_3_fill, onTap: _openFileList), ], ), ), ], ), ), ); } /// Widget _actionItem({ required IconData icon, bool isActive = true, void Function()? onTap, }) { Color offColor = Color(0xFFE75B61); return Expanded( child: Container( height: 50, color: isActive ? null : offColor.withValues(alpha: 0.3), child: IconButton( onPressed: onTap, icon: Icon( icon, color: isActive ? Colors.white : offColor, size: 20, ), ), ), ); } }