Actions
정리 #46
완료됨BBPlayer 완성
시작시간:
2026/03/25
완료기한:
2026/03/25
진척도:
100%
추정시간:
설명
완료된 기능 구현¶
1. Android Immersive 모드 적용 (v4.14)¶
initState에서SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky)호출- 플레이어 진입 시 시스템 UI 고정 숨김
- 컨트롤 표시/숨김 전환 시
MediaQuery.padding변화로 인한 레이아웃 이탈 현상 완전 해결 dispose시edgeToEdge로 복원
2. 컨트롤 숨김 시 터치 차단 방식 변경 (v4.15)¶
- 기존:
AnimatedOpacity를IgnorePointer로 래핑- 문제: 컨트롤 외부
GestureDetector의 스와이프 제스처까지 모두 차단
- 문제: 컨트롤 외부
- 변경:
Slider의onChanged/onChangeStart/onChangeEnd를_controlsVisible조건부null처리- 진행바만 비활성화되고 스와이프·탭 제스처는 정상 동작 유지
3. Android 뒤로가기 동작 개선 (v4.16)¶
PopScope(canPop: false) 적용으로 시스템 뒤로가기 버튼 인터셉트_saveAndPop()에서 현재 재생 위치 DB 저장 후SystemNavigator.pop()으로 앱 완전 종료- DS File 등 외부 앱에서 실행한 경우 해당 앱으로 복귀
- PC(
Windows/macOS)는 기존Navigator.pop()유지 (홈 화면으로 이동)
4. Android 홈 화면 최근 목록 숨김 (v4.17)¶
- Android는 DS File 등 외부 앱 인텐트로 직접 플레이어를 실행하는 패턴으로 최근 목록이 불필요
Platform.isAndroid조건으로 최근 목록 리스트 및 전체 삭제 버튼 미표시 처리- Android 홈 화면은 파일/폴더 열기 버튼만 표시
5. Android 시스템 제스처 충돌 방지 — 엣지 데드존 (v4.18)¶
- 화면 좌/우/하단 32dp 이내에서 시작한 스와이프를 BBPlayer 제스처로 처리하지 않음
_isEdgeTouch()헬퍼 메서드,_gestureCancelled플래그 추가- 수직 드래그(밝기/볼륨) 및 수평 드래그(탐색) 핸들러 모두 적용
- Android 시스템 UI 표시용 엣지 스와이프와의 충돌 해결
6. SMI 자막 형식 지원 (v4.19)¶
- 자동 로드 확장자 목록에
.smi추가 (기존:.srt/.ass/.ssa) - 수동 로드 파일 선택 다이얼로그에
smi확장자 추가 - mpv 기반
media_kit이 SAMI 형식을 네이티브 지원하므로 별도 파싱 불필요 - 싱크 오프셋(
SubtitleService)은 SRT 전용으로 SMI에는 미적용
7. 3.4.7 재생 중 파일 교체 — Android 제외 (v4.20)¶
- Android는 외부 앱 인텐트로 직접 실행하는 패턴이므로 재생 중 파일 교체 기능 불필요
- 상단 바 파일 열기 버튼 및
Ctrl+O단축키를!Platform.isAndroid조건으로 제한
8. 3.5.1 진행바 썸네일 미리보기 (v4.21)¶
- 플랫폼: Windows / macOS 전용 (마우스 입력 환경)
- 별도
_thumbPlayer(Player) 인스턴스로 메인 재생 중단 없이 프레임 seek LayoutBuilder로 슬라이더 실제 너비 계산MouseRegion(onHover/onExit) 으로 호버 위치 추적- 150ms 디바운스 후
_thumbPlayer.seek()+screenshot()→Image.memory()팝업 - 160×90 썸네일 + 시간 레이블 표시
- 드래그 중(
_isDragging) 팝업 자동 숨김
9. 3.5.4 드래그 앤 드롭 (v4.22)¶
- 플랫폼: Windows / macOS 전용 (
desktop_drop패키지) DropTarget으로 전체 화면 래핑 (Android는 조건부 제외)- 드롭 위치 판별:
detail.localPosition.dx로 플레이리스트 패널(우측 300px) 여부 확인
| 드롭 위치 | 동작 |
|---|---|
| 비디오 영역 | 현재 파일 교체 (다중 파일 시 전체 플레이리스트 교체 후 첫 번째 재생) |
| 플레이리스트 패널 위 (패널 열림 상태) | 파일을 목록 끝에 추가 |
- 드래그 중 영역별 시각 피드백 오버레이 표시
| 상태 | 오버레이 |
|---|---|
| 플레이리스트 닫힘 | 전체 화면 파란 테두리 + "파일을 드롭하여 재생" |
| 플레이리스트 열림 — 좌측 | 파란 영역 "파일 교체" |
| 플레이리스트 열림 — 우측 | 초록 영역 "목록에 추가" |
10. 3.5.2 자막 자동 검색 취소¶
- 외부 API 의존성 및 유지보수 부담 대비 실용성 부족으로 계획 취소
- 동일 폴더 자막 자동 로드(3.2.1)로 대체 가능
버그 수정¶
| # | 증상 | 원인 | 해결 |
|---|---|---|---|
| 1 | 컨트롤 숨김/표시 전환 시 버튼 위치 이탈 | MediaQuery.padding이 시스템 UI 표시 여부에 따라 변동 |
immersiveSticky로 시스템 UI 고정 숨김 |
| 2 | 컨트롤 숨김 상태에서 스와이프 제스처 불가 | IgnorePointer가 외부 GestureDetector까지 터치 차단 |
Slider 콜백을 null 처리하는 방식으로 교체 |
| 3 | PopScope 닫는 괄호 위치 오류로 빌드 실패 |
build() 메서드 종료 지점 이후에 괄호를 삽입 |
build() 내부 올바른 위치에 괄호 재배치 |
| 4 | Android에서 뒤로가기 시 홈 화면으로 이동 | Navigator.pop()은 앱 내 스택 이동 |
SystemNavigator.pop()으로 앱 완전 종료 |
| 5 | Android 엣지 스와이프가 BBPlayer 제스처로 인식 | 드래그 시작 위치 판별 없음 | 32dp 엣지 데드존 검사 추가 |
변경된 파일 목록¶
| 파일 | 변경 내용 |
|---|---|
lib/screens/player_screen.dart |
immersive 모드, IgnorePointer → Slider null 방식, PopScope, _saveAndPop, 엣지 데드존, SMI 지원, 파일 교체 Android 제외, 썸네일 미리보기, 드래그 앤 드롭 |
lib/screens/home_screen.dart |
Android 최근 목록 및 삭제 버튼 숨김 |
pubspec.yaml |
desktop_drop: ^0.4.4 추가 |
개발계획서.md |
v4.22으로 업데이트, 3.5.1·3.5.4 완료, 3.5.2 취소 |
Actions