인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Ben Kim님의 프로필 이미지

작성한 질문수

Flutter 앱 개발 실전

디자인 시스템 구성

디자인 시스템 구성에 대해 질문 드립니다

해결된 질문

작성

·

31

2

반응형 UI 설명중 기기 별 사이즈에 따라 UI가 변경되는것을 확인하였는데요, 모바일에서 가로모드 같은 경우에는 어떻게 반응형 UI를 구현해야 하나요? 플러터 개발에서 어떤 방식으로 가로모드에 대응하는지 궁금합니다. 기존 화면과 가로모드 화면을 따로 구현 해야 하나요?

답변 2

2

DevStory님의 프로필 이미지
DevStory
지식공유자

안녕하세요 Ben Kim님

Flutter에서 기기의 회전 상태는 MediaQuery.of(context).orientation 코드를 이용하여 확인할 수 있습니다. 이를 이용하여 다양하게 구현 하실 수 있는데, 한 가지 예시로 강의에서 사용한 context.layout() 함수에 Orientation 매개변수를 추가하면 다음과 같습니다.

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(),
        body: context.layout(
          (orientation) => Text("Default $orientation"),
          mobile: (orientation) => Text("Mobile : $orientation"),
          desktop: (orientation) => Text("Desktop : $orientation"),
          tablet: (orientation) => Text("Tablet : $orientation"),
        ),
      ),
    );
  }
}

abstract class Breakpoints {
  /// Device max width
  static const double mobile = 600;
  static const double tablet = 1000;
  static const double desktop = 1190;

  /// BottomSheet max width
  static const double bottomSheet = 600;
}

extension LayoutExt on BuildContext {
  /// Screen size
  Size get screenSize => MediaQuery.of(this).size;
  Orientation get orientation => MediaQuery.of(this).orientation;

  /// Responsive layout
  T layout<T>(
    T Function(Orientation orientation) base, {
    T Function(Orientation orientation)? mobile,
    T Function(Orientation orientation)? tablet,
    T Function(Orientation orientation)? desktop,
  }) {
    if (screenSize.width < Breakpoints.mobile) {
      return (mobile ?? base).call(orientation);
    } else if (screenSize.width < Breakpoints.tablet) {
      return (tablet ?? base).call(orientation);
    } else {
      return (desktop ?? base).call(orientation);
    }
  }
}

강의에서 다룬 것과 같이 UI 기획상 가로 모드와 새로 모드의 차이가 어느 정도인지에 따라 위젯을 분리하는 기준이 달라질 수 있으며, 한 파일에 모두 구현하기 보단 유지보수를 위해 별도 위젯으로 나누는 것을 권장드립니다.

감사합니다 🙂

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. Ben Kim님,

반응형 UI 설계는 다양한 화면 크기와 방향 변화에 적응할 수 있는 중요한 요소입니다. Flutter에서는 가로모드를 대응할 때 몇 가지 방법을 사용할 수 있습니다.

  1. MediaQuery: MediaQuery를 통해 화면의 높이, 너비, 방향 등을 쉽게 알 수 있으며, 이를 이용하여 화면 레이아웃을 조정할 수 있습니다.

    MediaQuery.of(context).orientation == Orientation.portrait
    

    이 코드를 통해 현재 디바이스의 방향을 확인한 후 세로 모드와 가로 모드를 구분할 수 있습니다.

  2. LayoutBuilder: LayoutBuilder 위젯을 사용하여 현재 화면의 제약조건을 감지하고 이에 맞춰 위젯을 구성할 수 있습니다. 가로모드에서는 보통 더 많은 공간을 이용하여 추가 정보를 보여주거나 레이아웃을 다양하게 조정할 수 있습니다.

  3. Responsive UI 라이브러리: flutter_screenutil 같은 라이브러리를 사용하면 다양한 화면 크기와 방향에 대응하는 반응형 디자인을 더 쉽게 구현할 수 있습니다.

Ben Kim님께서 질문하신 사항과 비슷한 질문에 대한 답변이 아래 링크에 존재합니다.

이 링크에서는 디자인 시스템을 구성하는 데 유용한 여러 가지 팁과 실전 사례에 대해 논의하고 있습니다. 특히 UI 변경에 민감한 Flutter에서 어떤 식으로 접근할 수 있는지 다양한 방법이 제시되어 있으며, 많은 도움이 되실 것이라 생각합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Ben Kim님의 프로필 이미지

작성한 질문수

질문하기