Rinda Calls · Flutter 모바일

2026 패턴 개선 리포트

토스트·즐겨찾기·설정 IA·연동 UX·연동 통계·앱정보, 그리고 bloc 레이스컨디션 전수감사까지 — 알파 브랜치 머지 완료.

브랜치 alpha 머지 PR 5건 테스트 60 통과 analyze 0 issues 감사 bloc/cubit 14개
5
머지된 PR
7
bloc 결함 수정
8
clean 확인 bloc
+9
신규 회귀 테스트

머지된 변경

#9680
완료/실행취소 토스트 잔류 봉인 + 즐겨찾기 탭 재동기피드 스낵바 6곳을 floating ToastService(네비 위)로 통합, 중복 누적 차단. 즐겨찾기 탭 진입마다 서버 재동기(refreshOnEnter)로 별표 즉시 반영.
#9681
설정 IA 정리 — Rinda 연동 별도 화면 + 전송·데이터 섹션 제거인라인 카드를 메뉴 버튼으로 축소, 별도 화면으로 push. 'Rinda로 전송'·'데이터' 섹션 제거, orphan 260줄 정리.
#9683
Rinda 연동 화면 UX 재설계 — QR-firstQR 스캔을 유일 primary hero(가장 쉬운 경로), 상태 배너 하나만 강조, 발급 안내를 액션에 인접, 점진 공개. uiux 5단계 근거.
#9685
연동 화면 통계 + 앱정보 링크/버전 동기화워크스페이스명·업로드(녹음/통화/SMS)·STT 분석 통계를 신규 device 엔드포인트 /summary 로 표시. 앱명·버전을 PackageInfo 동기화, 약관·개인정보를 app.rinda.ai 링크 연결.
#9686
bloc 레이스컨디션·낙관적복원·화면전환 2026 패턴 정합generation token·비파괴 refresh·isClosed 가드·낙관적 복원 재도출. 14개 bloc 전수감사 결과 반영.

bloc 전수감사 — 결함 및 수정

심각도위치문제 → 수정상태
P1auto_sms_cubitpage-scoped cubit 이 저장 응답 전 pop 시 닫힌 cubit 에 emit → StateError. isClosed 가드수정
P2recordings_bloc이벤트 트랜스포머 부재 + refresh 가 목록을 스피너로 blank. restartable + 공유 generation token + 비파괴 로딩수정
P2favorite_insights_cubitload/refreshOnEnter/toggle 세대 가드 부재로 stale write-back. generation token수정
P2favorite_insights_cubittoggle 실패 복원이 진입시점 스냅샷을 덮어써 그사이 갱신 유실. 현재 상태 기준 재삽입수정
P2call_log_cubitload/refresh 동시호출 stale write-back + loading 플리커. generation token수정
P2sms_cubitrefresh 동시진입 + _loaded 경합. generation token수정
P2recording_stats_cubit폴 실패 시 emit(null)로 카드 숨김(파괴적). 비파괴 실패 + 세대 가드수정
clean 확인 (2026 모범 사례 이미 준수)
insights_feed_blocsettings_cubitrecording_progress_cubit home_shell_cubitinsight_filter_cubitauto_analyze_cubit contact_sync_cubitpermission_cubit

적용한 2026 패턴

레이스컨디션세대 토큰(generation token)으로 await 뒤 stale 결과 폐기 · Bloc restartable/droppable/sequential 트랜스포머
낙관적 업데이트낙관적 반영 후 실패 시 현재 상태 기준 복원(스냅샷 clobber 금지)
화면전환page-scoped cubit 은 await 뒤 emit 을 isClosed 가드 · 상세 pop 시 서버 재동기
비파괴 refresh이미 데이터가 있으면 새로고침·폴 실패가 화면을 스피너/에러로 날리지 않음