[TIL] BMI 계산기 만들기

청학동버블티·2024년 11월 12일

Flutter 공부

목록 보기
2/18

오늘은 Flutter 강의를 들으며 BMI 계산기를 만들어봤다.

Flutter에서 제공되는 ThemeData 클래스를 활용하면
라이트 테마와 다크테마를 각각 구현하지 않아도 간편하게 switch 할 수 있고
HomePage / ResultPage 로 이루어진 앱을 만들 예정이다.


HomePage에서는 세로로 배치된 구성이므로 Column을 활용하고
각각 AppBar/GenderBox/HeightBox/WeightBox/ElevatedButton 위젯으로 구성돼있다.

HeightBox 와 WeightBox는 구조가 같으므로 위젯 컴포넌트화를 하면 편리하다.


ResultPage도 마찬가지로 세로구성이라 Column을 쓰고
AppBar/ResultGauge/ResultText/OutlineButton 위젯으로 구성한다.


- MaterialApp
	- HomePage
		- Scaffold
			- AppBar
			- Column
				- GenderBox
				- SliderBox()
				- SliderBox(몸무게)
				- ElevatedButton
	- ResultPage
		- Scaffold
			- AppBar
			- Column
				- ResultGauge
				- ResultText
				- OutlinedButton

폴더트리를 미리 정하면 편리하다.

- lib
	- pages
		- home
			- home_page.dart
			- widgets // HomePage 내에서 사용할 위젯들
		- result
			- result_page.dart
			- widgets // ResultPage 내에서 사용할 위젯들
	- widgets // 앱 내에서 전체적으로 함께 사용되는 위젯들. 이번 프로젝트에서는 쓸일이 없음.

Flutter 에서는 MaterialApp 내의 전반적인 시각적 테마구성을 정의하여 제공한다.
이 ThemeData 클래스를 활용하면 다크테마/라이트 테마를 각각 구현하지 않아도 돼서 편리하다.

ThemeData(
    useMaterial3: true, // Material3 디자인 사용여부 2와의 차이는 아래 그림 참조
     // ColorScheme 클래스의 fromSeed 생성자를 사용하면
     // seedColor 를 기준으로 각각 요소들의 색상을 정해줍니다.
    colorScheme: ColorScheme.fromSeed(
      seedColor: Colors.purple,
      // dark, light 에 따라 디자인이 배경 색상 등이 다크모드, 라이트모드로 달라집니다
      brightness: Brightness.dark, 
    ),
    // 앱 내에서 사용할 TextTheme 를 정할수도 있는데 
    // displayLarge, titleLarge 등의 속성별로 정의할 수 있습니다.
    textTheme: TextTheme(
      displayLarge: const TextStyle(
        fontSize: 72,
        fontWeight: FontWeight.bold,
      ),
      // ···
      titleLarge: GoogleFonts.oswald(
        fontSize: 30,
        fontStyle: FontStyle.italic,
      ),
      bodyMedium: GoogleFonts.merriweather(),
      displaySmall: GoogleFonts.pacifico(),
    ),
  ),

또한 ElevatedButtonTheme, AppBarTheme, TextButtonTheme 등 flutter 에서 기본으로 제공하는 위젯들의 테마도 지정가능하다.


이때 Container border색상은 ThemeData 내에서 정의할수 없다.
이는 Divider라는 단순히 선을 그어주는 위젯에 사용되는 색상인 dividerColor를 재정의 해서 Container의 Border에 적용하면 된다.


<Slider 위젯>

Slider(
	// 값 - 여기서는 테마 확인을 위해 고정값을 넣었지만
	// 사용할 때에는 변수를 넣고 onChanged에서 해당 변수의 값을 바꿔주고
	// setState 호출해서 사용
  value: 1, 
  onChanged: (v) {},
  min: 1, // 최소값
  max: 300, // 최대값
)

이때 테마는 ThemeData의 sliderTheme속성에 SliderThemeData 클래스를 정의해서 사용한다.

  sliderTheme: SliderThemeData(
    activeTrackColor: Colors.white30, // 현재값 기준 왼쪽 색상
    inactiveTrackColor: Colors.white30, // 현재값 기준 오른쪽 색상
    trackHeight: 1, // 막대기 높이(두께)
    thumbColor: Colors.pinkAccent, // 동그라미 (현재값)
  ),

0개의 댓글