[플러터] 위젯의 크기&위치를 반환받는 법

2020. 12. 15. 20:59·Flutter/Flutter Tech

플러터에서 특정 위젯의 크기와 위치를 반환 받는 방법은 아래와 같다.

 

코드

//GlobalKey를 선언한다.
GlobalKey _viewKey = GlobalKey();

void initState(){
		//Build가 실행되어 위젯이 그려진 후 해당 함수가 실행된다.
	    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      _getSize();
    });
}

_getSize(){
	//위젯 key로 RenderBox를 정의한다.
	RenderBox _viewBox = _viewKey.currentContext.findRenderObject();
    Offset offset = _viewBox.localToGlobal(Offset.zero);

	//위젯의 좌표를 반환받는다
    cdx = offset.dx;
    cdy = offset.dy;

	//위젯의 크기를 반환받는다.
    width = _viewBox.size.width;
    height = _viewBox.size.height;
}


Widget build(BuildContext context){
...
//크기를 받고자하는 위젯의 key에 앞서 선언한 GlobalKey를 부여한다.
 return Container(
	key : _viewKey
    ...
)
...

 

설명

플러터에서 위젯의 크기와 위치를 반환받기 위해선 위젯이 먼저 그려져야한다.

위젯이 그려지기 전 크기와 위치 반환을 요청하면 0이 반환된다.

플러터의 LifeCycle은 간단하게 다음과 같다.

 

LifeCycle

1. 클래스에 선언 및 정의된 변수를 읽는다.

2. initState()를 실행한다.

3. build()를 실행해 위젯을 바인딩 및 랜더링한다.

 

따라서, 위젯의 크기를 요청하는 함수는 바인딩이 완료된 후에 정상적으로 작동하므로,

initState나 일반 선언된 변수에 곧바로 반환받을 수 없다.

 

따라서 위젯이 바인딩되면 호출되는 함수를 사용한다.

WidgetsBinding.instance.addPostFrameCallback 이며 initState에서 이를 호출하고

반환 값으로 위젯의 사이즈를 구하는 함수를 호출시키면 바인딩 이후 곧바로 위젯 사이즈를 받을 수 있다.

 

이 함수와 위젯의 사이즈와 크기를 받는 것은 한 세트라고 생각하고 사용하면 된다.

 

응용

앞서 설명한 것처럼, 위젯의 크기와 위치는 위젯이 생성된 이후 반환받을 수 있는데,

위젯의 크기를 확인해 스크린보다 크다면 조절하는 등 크기, 위치를 받아 재 랜더링을 해야하는 경우가 있다.

재 랜더링 하기전의 위젯이 스크린보다 큰 경우 사용자에게 보여지지 않길 원할 것이다.

이 경우 랜더링은 되지만 화면에 보여지지 않도록 Opacity 위젯을 사용하면 된다.

 

 

//위젯의 크기를 받았는지 여부
bool _isLoaded = false;


_getSize(){
...

//위젯의 크기를 반환받았음을 알린다.
setState((){
_isLoaded = true;
//반환받은 위젯의 크기로 다른 위젯의 크기를 결정하는 코드 삽입
});
}
  
  Widget build(BuildContext context){
	        //Opacity는 위젯의 투명도를 조절할 수 있다.
            return Opacity(
                  opacity: _isLoaded ? 1 : 0,

위젯의 사이즈를 아직 받아오지 않았다면 _isLoaded가 false로 opacity가 0으로 위젯이 보이지 않는다.

 

저작자표시 비영리 변경금지 (새창열림)

'Flutter > Flutter Tech' 카테고리의 다른 글

[플러터] 파일을 cache 저장소에 저장하기  (0) 2020.12.25
[플러터] 이미지를 cache 저장소에 저장하기  (0) 2020.12.22
[플러터] 자식 클래스에서 부모 클래스에 데이터 전달  (0) 2020.11.19
[Flutter] 키보드 팝업 상태에서 뒤로가기 이벤트 처리  (0) 2020.09.24
[Flutter] 선택된 위젯을 관리하는 Focusnode  (0) 2020.09.24
'Flutter/Flutter Tech' 카테고리의 다른 글
  • [플러터] 파일을 cache 저장소에 저장하기
  • [플러터] 이미지를 cache 저장소에 저장하기
  • [플러터] 자식 클래스에서 부모 클래스에 데이터 전달
  • [Flutter] 키보드 팝업 상태에서 뒤로가기 이벤트 처리
박유상의 개발블로그
박유상의 개발블로그
개발블로그
  • 박유상의 개발블로그
    박유상의 개발블로그
    박유상의 개발블로그
  • 전체
    오늘
    어제
    • 전체 (134)
      • Who am I (10)
        • Portfolio (4)
        • Reminiscence (5)
        • Oversea (1)
        • SiliconValley (0)
      • React (36)
        • React Basic (15)
        • React Tech (5)
        • JavaScript (7)
        • TypeScript (3)
        • CSS&HTML (3)
        • Firebase (3)
      • NodeJS (1)
        • NodeJS Basic (1)
      • Flutter (55)
        • Flutter Widget Design (5)
        • Flutter Widget Basic (8)
        • Flutter Tech (18)
        • Flutter Issue (7)
        • Flutter Web (6)
        • About Flutter (2)
        • Firebase (1)
        • Dev Env (1)
        • Dart (7)
      • Programming (31)
        • Web (1)
        • General (0)
        • Algorithm (25)
        • Python (1)
        • VS Code (2)
      • Django (0)
  • 블로그 메뉴

    • Who I AM
    • React
    • NodeJS
    • Flutter
    • Programming
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Redux
    플러터
    react
    파이썬
    HTML
    포트폴리오
    CSS
    useTranslation
    DP
    자바스크립트
    DART
    map
    탐욕법
    링고리
    Lingory
    Flutter
    웹
    플러터 웹
    TypeScript
    Firebase
    알고리즘
    flutter web
    프로그래머스
    리액트
    JavaScript
    github
    useRef
    useState
    JSON
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
박유상의 개발블로그
[플러터] 위젯의 크기&위치를 반환받는 법
상단으로

티스토리툴바