-
[Flutter] 플러터 웹 사이트 반응형으로 생성하기웹 개발/Flutter 2021. 1. 23. 22:30반응형
기존에 만들었던 웹사이트는 반응형 웹을 위한 설정이 적용되어있지 않기 때문에
웹 화면을 조절했을 때 아래와 같이 overflow가 발생하거나 웹사이트의 UI가 유지되지 않는다.
1) responsive builder
반응형 웹 사이트를 구축하기 위해 responsive builder 패키지를 사용한다.
responsive_builder: ^0.1.2
웹을 실행하는데 사용되는 디바이스에 맞는 페이지를 설정하면 디바이스에 맞는 반응형 웹을 생성해준다.
디바이스 크기를 일일히 설정해줘야할 필요를 줄여주는 패키지라고 생각한다.
watch, mobile, tablet, desktop
void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: ScreenTypeLayout( mobile: HomeScreenMobile(), tablet: HomeScreenDesktop(), ),); } }
모바일 디바이스 사이즈에 맞는 페이지를 새롭게 추가해줬다.
class HomeScreenMobile extends StatelessWidget { const HomeScreenMobile({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: CenteredView( child: Column( children: <Widget>[ NavigationBar(), Divider( thickness: 1, height: 1, color: Colors.black26, ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ HomeBody(), SizedBox( height: 30, ), Center( child: CallToActionButton('View'), ), ], ), ), ], ), ), ); } }
2) expanded
expanded는 child가 row와 column 내에 빈 공간을 채우도록 child를 확장시킨다.
따라서 디바이스 크기에 맞게 component 들이 빈 공간을 찾아 배열되도록 expanded로 감싼다.
homebody와 button을 감싼 column에 expanded를 적용하지 않는다면 다음과 같이 overflow가 발생한다.
expanded를 적용한 후에는 화면크기를 줄였을 때 component들이 빈공간을 채워
배열되어 있다는 것을 알 수 있다.
class HomeScreenDesktop extends StatelessWidget { const HomeScreenDesktop({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: CenteredView( child: Row( children: <Widget>[ NavigationBar(), VerticalDivider( thickness: 1, width: 1, color: Colors.black26, ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ HomeBody(), SizedBox(height: 30,), Center( child: CallToActionButton('View'), ), ], ), ), ], ), ), ); } }
화면의 높이를 줄였을 때 버튼의 높이가 정해져 있기 때문에 overflow가 발생함
버튼에 expanded를 적용했을 때 높이가 줄어들어도 버튼이 column의 빈 공간을 찾아
유연하게 변한다는 것을 알 수 있었다.
Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ HomeBody(), Expanded( child: Center( child: CallToActionButton('View'), ), ), ], ), ),
3) ResponsiveBuilder를 이용한 device type 별 사이즈 조절
class HomeBody extends StatelessWidget { @override Widget build(BuildContext context) { return ResponsiveBuilder(builder: (context, sizingInformation) { var textAlignment = sizingInformation.deviceScreenType == DeviceScreenType.mobile ? TextAlign.left : TextAlign.center; double titleSize = sizingInformation.deviceScreenType == DeviceScreenType.mobile ? 30 : 50; double descriptionSize = sizingInformation.deviceScreenType == DeviceScreenType.mobile ? 10 : 15; return Container( color: Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "'FLUTTER WEB.\nCOMPONENTS'", style: TextStyle( color: Colors.black, fontWeight: FontWeight.w600, fontSize: titleSize, height: 0.9), ), SizedBox( height: 20, ), Text( 'In this course we will go over the basics of using Flutter Web for website development.\nTopics will include Responsive Layout, Deploying, Font Changes, Hover Functionality, Modals and more.', style: TextStyle(fontSize: descriptionSize, height: 1.7), textAlign: textAlignment, ), ]), ); }); } }
4) LayoutBuilder
상위 위젯 (parent's widget)에 의존하는 위젯 트리를 생성한다.
LayoutBuilder( builder: (context, constraints) { if (constraints.maxWidth > 600) { return _buildWideContainers(); } else { return _buildNormalContainer(); } }, ),
5) MediaQuery.of()
현재 앱의 size와 orientation을 가져온다.
var screenSize = MediaQuery.of(context).size
print(screenSize.width)
var screenSize = MediaQuery.of(context).size; print(screenSize.width);
6) FittedBox
지정해준 fit에 따라 자식 위젯의 크기와 방향을 변화시킨다.
MyBlueRect( child: FittedBox( alignment : Alignment.center, fit: BoxFit.contain(), child: myDashPic(), ), ),
반응형'웹 개발 > Flutter' 카테고리의 다른 글
[Flutter Web] Fluro 패키지로 네비게이션 라우팅하기 ( Deep link / Transitions) (1) 2021.02.11 [Web] 안드로이드 스튜디오에서 웹 실행시 포트 지정(설정) 하는 법 (0) 2021.02.07 [Flutter] Service locator pattern을 사용해 build context 없이 navigate 하기 (0) 2021.01.31 [Flutter] 플러터 종속성 주입 (InheritedWidgets/ get_it / provider) (0) 2021.01.28 [Flutter] 플러터 웹 프로젝트 생성 (0) 2021.01.23