-
[Flutter] 플러터 Expanded? 익스펜디드 Flexible? 플렉서블플러터 Flutter 2021. 8. 1. 19:33반응형
Expanded는 Flexible위젯의 fit옵션이 FlexFit.tight로 고정된 위젯이다.
class Expanded extends Flexible { const Expanded({ Key key, int flex = 1, @required Widget child, }) : super( key: key, flex: flex, fit: FlexFit.tight, child: child ); }
Flexible위젯이 Expanded위젯보다 옵션 설정이 더 디테일 할뿐이다.
Expanded( child: Foo(), );
Flexible( fit: FlexFit.tight, child: Foo(), );
결과는 같다.
여러가지 에제로 위젯의 사용법을 보자~~
주의 Flexible위젯 or Expanded위젯은 반드시 Column() , Row() 위젯 안에서 사용해야한다.
1. Flexible 위젯
예제 1. 기본 컨테이너로만 구성했을 때
class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ Container( height: 100, child: Text('Containier 1 텍스트는 길게 해보자'), color: Colors.red, ), Container( height: 100, child: Text('Containier 2'), color: Colors.blue, ), Container( height: 100, child: Text('Containier 3'), color: Colors.orange, ), ], ); } }
결과
예제 2. FlexFit.tight 사용
class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ Container( height: 100, child: Text('Containier 1 텍스트는 길게 해보자'), color: Colors.red, ), Flexible( fit: FlexFit.tight, child: Container( height: 100, child: Text('Containier 2'), color: Colors.blue, ), ), Container( height: 100, child: Text('Containier 3'), color: Colors.orange, ), ], ); } }
결과
강제적으로 사용 할 수 있는 공간을 다 차지하게 한다.
예제 3. 여러곳에 FlexFit.tight 사용하기
class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ Container( height: 100, child: Text('Containier 1 텍스트는 길게 해보자'), color: Colors.red, ), Flexible( fit: FlexFit.tight, child: Container( height: 100, child: Text('FlexFit.tight 1'), color: Colors.blue, ), ), Flexible( fit: FlexFit.tight, child: Container( height: 100, child: Text('FlexFit.tight 2'), color: Colors.orange, ), ), ], ); } }
결과
먼저 첫번째 빨간색 컨테이너에게 공간을 할당하고 나머지 공간을 파랑과 주황이 나눠 가진다.
그런데 파란색이 주황색의 두배만큼 가져가게 하려면 flex값을 지정해주면된다. flex는 default가 1이다.
Flexible( fit: FlexFit.tight, flex : 2, child: Container( height: 100, child: Text('FlexFit.tight 1'), color: Colors.blue, ), ),
결과
Row는 child의 flex값을 모두 더한뒤에 나눈다. 위의 경우에는 2+1 = 3을 하고 2/3 그리고 1/3을 가져 간다.
에제 4. 주황색만 fit을 FlexFit.loose을 사용
class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ Container( height: 100, child: Text('Containier 1 텍스트는 길게 해보자'), color: Colors.red, ), Flexible( fit: FlexFit.tight, flex : 2, child: Container( height: 100, child: Text('FlexFit.tight 1'), color: Colors.blue, ), ), Flexible( fit: FlexFit.loose, child: Container( height: 100, child: Text('FlexFit.tight 2'), color: Colors.orange, ), ), ], ); } }
결과
파랑색은 FlexFit.tight으로 강제로 늘리기 때문에 여전히 전과 같이 남겨진 부분의 2/3을 가져간만큼 차지하고 있다.
주황색은 FlexFit.loose니까 필요한 공간만 차지하고 있다. 그러면 남은 1/3은
mainAxisAlignment: MainAxisAlignment.spaceAround 옵션으로 인해 child주변의 공간으로 동등하게 나눠졌다.
주황색의 FlexFit.loose는 그대로 두고 flex값을 2로 했을때
Flexible( fit: FlexFit.tight, felx : 2, child: Container( height: 100, child: Text('FlexFit.tight 2'), color: Colors.orange, ), ),
파랑색은 이제 남겨진 부분의 2/4을 가져간만큼 차지하고 있다. 그리고 주황색은 변함 없이 필요한 공간만 차지하고있다.
2. Expanded 위젯
예제 1. 컨테이너 안의 텍스트를 아주 길게 입력해보기
class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ Container( height: 100, child: Text('Containier 1'), color: Colors.red, ), Container( height: 100, child: Text('Containier 2 텍스트는 아주 길게 해보자 과연 어떤 결과? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ '), color: Colors.blue, ), Container( height: 100, child: Text('Containier 3'), color: Colors.orange, ), ], ); } }
결과
픽셀 오버플로우 에러가 발생한다. 지정한 영역보다 표시할 내용이 넘치면 발생하는 에러다. (일명: 횡단보도 에러..)
이 에러를 해결하려면 간단하게 Expanded 위젯으로 감싸주면 된다.
Expanded( child: Container( height: 100, child: Text('Containier 2 텍스트는 아주 길게 해보자 과연 어떤 결과? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ '), color: Colors.blue, ), ),
결과
Expanded로 감싸주면 텍스트가 넘쳐도 개행이 된다. 아까 횡단보도 에러는 발생하지 않는다.
주황색도 Expanded를 감싸보자
Expanded( child: Container( height: 100, child: Text('Containier 2 텍스트는 아주 길게 해보자 과연 어떤 결과? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ '), color: Colors.blue, ), ), Expanded( child: Container( height: 100, child: Text('Containier 3'), color: Colors.orange, ), ),
결과
파란색과 주황색의 영역이 같아진다.
결론
간단하게 위젯의 텍스트가 넘치는 것을 방지하려면 > Expanded
디테일하게 영역을 설정하려면 > Flexible
포스팅의 참조
https://mike123789-dev.tistory.com/entry/%ED%94%8C%EB%9F%AC%ED%84%B0Flexible%EA%B3%BC-Expanded-%EC%9C%84%EC%A0%AF
https://stackoverflow.com/questions/52645944/flutter-expanded-vs-flexible
반응형'플러터 Flutter' 카테고리의 다른 글
[Flutter] flutter doctor --android-licenses 플러터 라이센스 오류해결 (0) 2022.02.26 [Futter] 플러터 현재 디바이스의 화면 크기 알아내기(App Screen Size) (0) 2021.08.08 맥북(M1칩) 플러터 cocoapods 설치에러 문제해결하기 (0) 2021.07.15 [Flutter]플러터 위젯orClass에 속성(옵션) 추가하기 copyWIth() (0) 2021.06.26 [Flutter] 플러터 Spacer 위젯으로 위젯 사이의 조절 가능한 공간 넣기 (0) 2021.06.14