Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- JS
- 단축키
- scss
- JQ
- riverpod
- lifecycle
- ListView
- println
- java
- DART
- 앱심사
- unity
- java 콘솔 출력 차이
- firebase
- nodejs
- 자바 포맷 출력
- 배포
- react
- 엡
- 자바스크립트
- Clean Architecture
- develop
- printf
- npm
- abap
- java 출력
- 자바 출력 방식
- UI/UX
- Flutter
- LLM
Archives
- Today
- Total
guricode
[영화정보앱 만들기-2] [트러블 슈팅] Dio 인터셉터 handler.next 누락으로 요청 영구 대기 본문
앱/Flutter&Dart
[영화정보앱 만들기-2] [트러블 슈팅] Dio 인터셉터 handler.next 누락으로 요청 영구 대기
agentrakugaki 2025. 8. 27. 11:27- [상황 인지]
-
- usecase.execute() 이후 진행 멈춤.
- 콘솔에 usecase 로그까지만 출력. 에러/타임아웃 없음.
- 화면은 로딩 스피너 유지.
- [고민]
- 왜 Future가 완료되지 않을까?
- 네트워크 계층에서 요청이 막힌 듯하다.
- Dio Interceptor.onRequest에서 체인을 진행하지 않으면 파이프라인이 정지한다.
- [적용]
- 인터셉터에 handler.next(options) 추가.
- 타임아웃·로그로 빠른 탐지 설정.
-
문제코드
-
-
import 'package:dio/dio.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; //통신 class DioClient { // await dotenv.load(fileName: ".env"); static Dio get client => _client; static Dio _client = Dio( BaseOptions( baseUrl: 'https://api.themoviedb.org/3/movie/', validateStatus: (status) => true, ), )..interceptors.add(interceptor); //하이잭킹 -> 헤더 static AuthInterceptor interceptor = AuthInterceptor(); } class AuthInterceptor extends Interceptor { @override void onRequest( RequestOptions options, RequestInterceptorHandler handler, ) { // options.headers.addAll( { 'Authorization': 'Bearer ${dotenv.env['TMDB_TOKEN']}', 'accept': 'application/json', }, ); } } - 해결코드
-
import 'package:dio/dio.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
//통신
class DioClient {
// await dotenv.load(fileName: ".env");
static Dio get client => _client;
static Dio _client = Dio(
BaseOptions(
baseUrl: 'https://api.themoviedb.org/3/movie/',
validateStatus: (status) => true,
),
)..interceptors.add(interceptor); //하이잭킹 -> 헤더
static AuthInterceptor interceptor = AuthInterceptor();
}
class AuthInterceptor extends Interceptor {
@override
void onRequest(
RequestOptions options,
RequestInterceptorHandler handler,
) {
//
options.headers.addAll(
{
'Authorization': 'Bearer ${dotenv.env['TMDB_TOKEN']}',
'accept': 'application/json',
},
);
super.onRequest(options, handler);
}
}
-
- [결과]
- 요청이 정상 완료(200 또는 401 등)되고 화면 로딩 해제.
- 무한 대기 제거. 디버깅 로그로 원인 분리 쉬워짐.
- 내가 배운 것:
- Dio 인터셉터는 항상 handler.next/resolve/reject로 체인을 종료해야 한다.
- 무한 대기는 대개 “체인 미호출”이나 “await 누락” 같은 제어 흐름 문제다.
- 타임아웃·요청/응답 로깅을 기본값으로 둬서 조기 감지하라.
- [결과]
체크리스트
- onRequest 마지막 줄에 handler.next(options) 있는가.
- .env가 로드됐고 TMDB_TOKEN이 비어 있지 않은가.
- baseUrl와 엔드포인트 조합이 중복되지 않는가.
- 타임아웃이 설정되어 있는가.
- 401, 404 등 오류도 “완료”로 떨어지는지 로그 확인.
'앱 > Flutter&Dart' 카테고리의 다른 글
| [클린아키텍쳐]Clean Architecture -1 (1) | 2025.08.30 |
|---|---|
| CICD 관련 메모 (0) | 2025.08.29 |
| [영화정보앱 만들기] 의존성 설정,dotenv (2) | 2025.08.26 |
| MVVM 패턴 연습 (3) | 2025.08.25 |
| [TIL] 20250819 - GoRouter,Responsive UI (0) | 2025.08.19 |