250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- viewmodel
- data
- Coroutines
- android
- livedata
- ScrollView
- scroll
- CustomScrollView
- drift
- 계측
- DART
- Flutter
- 테스트
- intent
- 안드로이드
- textfield
- Button
- Compose
- tabbar
- Navigation
- LifeCycle
- activity
- 앱
- TEST
- 앱바
- binding
- Kotlin
- textview
- Dialog
- appbar
Archives
- Today
- Total
Study Record
[Flutter] 위젯이 차지하는 크기 알아보기 (LayoutBuilder) 본문
728x90
🎁 LayoutBuilder
빌드 방식을 사용하면서 위젯을 완성하기 전에 위젯의 크기를 확인할 수 있는 위젯이다.
builder 의 constraint.maxHeight 와 constraint.maxWidth 변수로 위젯의 너비와 높이를 알 수 있다.
LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraint){
// LayoutBuilder 가 차지하고 있는 높이
constraint.maxHeight;
// LayoutBuilder 가 차지하고 있는 너비
constraint.maxWidth;
return Container();
}
)
예시 😶) 가로 스크롤의 ListView 에서 한 아이템이 한 스크롤 화면 당 3개의 항목을 보여주고 싶을 때 LayoutBuilder 를 사용하여 가져온 위젯 전체의 너비값으로 한 항목 당 너비를 3/1 하면 가능하다.
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "layoutBuilder",
home: Scaffold(
appBar: AppBar(title: const Text("layoutBuilder")),
body: MyStatelessWidget(),
),
);
}
}
class MyStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.all(16.0),
width: MediaQuery.of(context).size.width,
height: 200,
decoration: BoxDecoration(
border: Border.all(color: Colors.green),
borderRadius: const BorderRadius.all(Radius.circular(16.0)),
color: Colors.white,
),
child: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraint){
final physics = PageScrollPhysics(parent: BouncingScrollPhysics());
return Container(
child: ListView.builder(
itemCount: 9,
physics: physics,
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext context, int index) {
return MyContainer(width: constraint.maxWidth / 3, index: index);
},
),
);
},
),
);
}
}
class MyContainer extends StatelessWidget {
final double width;
final int index;
const MyContainer({Key? key, required this.width, required this.index}) : super(key: key);
@override
Widget build(BuildContext context) {
return SizedBox(
width: width,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("$index번째"),
const SizedBox(height: 10.0),
Container(width: 50, height: 50, color: Colors.deepOrangeAccent),
],
),
);
}
}
728x90
'Flutter' 카테고리의 다른 글
[Flutter] 입력 폼이 포함된 화면 자연스럽게 구성하기 (0) | 2023.04.07 |
---|---|
[Flutter] 안드로이드 스튜디오 dart version 설정하기 - Windows (0) | 2023.03.23 |
[Flutter] 앱 바 사이즈 (0) | 2023.03.12 |
[Flutter] key? (0) | 2023.03.02 |
[Flutter] 바텀 시트에서 입력받기(TextField) - 키보드 위로 패딩 조절 (0) | 2023.02.28 |