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
- 엡
- java 콘솔 출력 차이
- Flutter
- 자바 포맷 출력
- UI/UX
- 단축키
- java 출력
- 앱심사
- unity
- DART
- develop
- lifecycle
- ListView
- println
- 자바 출력 방식
- firebase
- 배포
- JS
- printf
- abap
- nodejs
- JQ
- LLM
- react
- riverpod
- scss
- 자바스크립트
- Clean Architecture
- java
- npm
Archives
- Today
- Total
guricode
[TIL] 20250819 - GoRouter,Responsive UI 본문
GoRouter
실습코드
https://github.com/FEgguri/flutter_gorouter
1. 특징
- 선언형 라우팅: URL 경로 기반으로 라우트 스택 관리
- Path Parameter: /post/:id → /post/1 같은 형태로 사용
- Query Parameter: /search?text=abc 형태 지원
- 웹 새로고침 시에도 파라미터 유지
2. 기본 설정
final router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => const HomePage(),
routes: [
GoRoute(
path: 'post',
builder: (context, state) => const PostListPage(),
routes: [
GoRoute(
path: ':id',
builder: (context, state) {
final id = int.tryParse(state.pathParameters['id'] ?? '');
return id == null ? const ErrorPage() : PostDetailPage(id: id);
},
),
],
),
GoRoute(
path: 'search',
builder: (context, state) {
final text = state.uri.queryParameters['text'] ?? '';
return text.isEmpty ? const ErrorPage() : SearchPage(text: text);
},
),
],
),
],
initialLocation: '/',
errorBuilder: (context, state) => const ErrorPage(),
);
3. MaterialApp 연동
MaterialApp.router(
routerConfig: router,
);
4. 페이지 이동
// Path Parameter
context.go('/post/123');
// Query Parameter
context.go(Uri(path: '/search', queryParameters: {'text': 'abc'}).toString());
context.go('/search?text=abc');
// Extra 객체 전달
context.go('/123', extra: user);
👉 요약
GoRouter는 경로 기반 네비게이션 관리를 단순화해주며,
path parameter, query parameter, extra 방식으로 유연하게 데이터 전달 가능하다.
context.go는 URL 스택 관리 기반, context.push는 단순 스택 추가라서 일반적으로 go 사용 권장.
반응형 UI
실습코드 https://github.com/FEgguri/flutter_ui
- 화면 크기나 기기(모바일, 태블릿, PC)에 따라 UI를 자동으로 재배치하는 방식
- 태블릿, 폴더블 폰, PC 대응 때문에 중요해짐
Breakpoints (가로 기준)
- ≥1024 : PC
- ≥768 : 태블릿
- ≥600 : 소형 태블릿 (Z폴드 등)
- ≥480 : 모바일 가로
- <480 : 모바일 세로
구현 방법
(1) LayoutBuilder 사용
부모 위젯 크기를 기준으로 UI 변경
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth >= 768) {
return HomeBodyTablet(); // 태블릿
}
if (constraints.maxWidth >= 600) {
return HomeBodyTabletSm(); // 소형 태블릿
}
if (constraints.maxWidth >= 480) {
return HomeBodyLandscape(); // 모바일 가로
}
return HomeBody(); // 모바일 세로
},
);
}
}
(2) MediaQuery 사용
디바이스 전체 화면 크기를 기준으로 UI 변경
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
Size size = MediaQuery.sizeOf(context);
double deviceWidth = size.width;
if (deviceWidth >= 768) {
return HomeBodyTablet();
}
if (deviceWidth >= 600) {
return HomeBodyTabletSm();
}
if (deviceWidth >= 480) {
return HomeBodyLandscape();
}
return HomeBody();
}
}
4. 차이점
| 항목 | LayoutBuilder | MediaQuery |
|---|---|---|
| 기준 | 부모 위젯 크기 | 디바이스 전체 크기 |
| 장점 | 세밀한 위젯 배치 조정 | 전체 화면 기준 분기 처리 |
| 사용 | 위젯 내부 레이아웃 | 페이지 단위 UI |
👉 정리: 부모 위젯 크기 기준이면 LayoutBuilder, 전체 화면 크기 기준이면 MediaQuery 사용
'앱 > Flutter&Dart' 카테고리의 다른 글
| [영화정보앱 만들기] 의존성 설정,dotenv (2) | 2025.08.26 |
|---|---|
| MVVM 패턴 연습 (3) | 2025.08.25 |
| Flutter ThemeExtension (2) | 2025.08.18 |
| Flutter Firebase 시작 정리 - 설치부터 초기화까지 (3) | 2025.08.14 |
| 트러블슈팅: “프로필 이미지 선택만 했는데 바로 서버에 업로드됨” (2) | 2025.08.12 |