Flutter - #3. LayoutBuilder

내가 보려고 쓰는 Flutter Widget 일기

참고 : https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html



LayoutBuilder

오늘 배워본 위젯은 LayoutBuilder
플러터 배운지 이제 보름이 되어가는지라 솔직히 공식 페이지 설명은 무슨 말인지 잘 못알아들었다;; 뭐... 대충은 요런 내용이었다.

부모 위젯 사이즈에 의존하는 위젯 트리를 만든다. 부모 위젯이 자식 위젯의 사이즈에 제약을 두거나, 자식 위젯의 고유한 크기와는 상관없이 기능할 때 유용하다. 뭐래는겨

일단 주목할만한 점은 레이아웃에 따라 위젯 빌드를 다르게 할 수 있다는 점! 그리고 builder 속성은 반드시 채워줘야한다.







코드 예시로 알아보자

/// Flutter code sample for LayoutBuilder

/* This example uses a [LayoutBuilder] to build a different widget 
depending on the available width.*/

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

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

  
  Widget build(BuildContext context) {
    return const MaterialApp(
      title:'Test LayoutBuilder',
      home: LayoutBuilder_Widget(),
    );
  }
}

class LayoutBuilder_Widget extends StatelessWidget {
  const LayoutBuilder_Widget({Key key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Test LayoutBuilder')),
      body: LayoutBuilder(
        builder: (BuildContext context, BoxConstraints constraints) {
          //print(constraints.maxWidth);
          if (constraints.maxWidth > 500) {
            return _buildLandScape();
          } else {
            return _buildPortrait();
          }
        },
      ),
    );
  }

  Widget _buildPortrait() {
    return Center(
      child: Container(
        height: 100.0,
        width: 100.0,
        color: Colors.red,
      ),
    );
  }

  Widget _buildLandScape() {
    return Center(
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          Container(
            height: 100.0,
            width: 100.0,
            color: Colors.red,
          ),
          Container(
            height: 100.0,
            width: 100.0,
            color: Colors.yellow,
          ),
        ],
      ),
    );
  }
}

중간에 print로 애뮬레이터의 너비를 찍어보았더니 411이 나왔다. 그럼 constraints.maxWidth > 500 이면 대충 가로 화면 조건으로 줄 수 있다. 가로화면이면 박스를 2개, 세로화면이면 박스를 1개 띄우도록 해보았다.
세로화면이면 아래와 같다.





가로화면이면?

세로화면 일때는 화면 양옆으로 데이터를 많이 띄우기엔 무리가 있는데, 가로화면 일때는 가로로 데이터를 나열해도 가독성에 큰 영향이 없게 된다.

오늘의 일기는 여기까지!

좋은 웹페이지 즐겨찾기