본문 바로가기

카테고리 없음

[Flutter.241114] 왜 본인의 상태를 자기가 관리하지 않고, 위에 떠넘기지?

제목은 오늘 배운 것 중에 가장 중요하다고 생각되는 것을 중심으로 만들었고,

나머지는 오늘 배운 이것저것들의 나열이다.

 

 

 

 

1. 

각각의 위젯이 아니라, 상위 위젯에서 상태를 관리 하는 이유는 뭐지?

사실 정답은 없다. 다양한 방식으로 상태 관리를 진행할 수 있다. 즉 프로그램 작성자의 취향이나, 선호에 따라 달라질 수 있는 부분. 

(참조: https://docs.flutter.dev/ui/interactivity)

 

Add interactivity to your Flutter app

How to implement a stateful widget that responds to taps.

docs.flutter.dev

 

하지만, 지금 내가 공부하고 있는 BMI 수치를 출력하는 앱의 경우에 한정해서, 

사용자가 터치해서 값을 변경하는 개별 위젯이 아닌, 그러한 위젯들이 모여서 구성하는 홈페이지에서 상태 관리를 하는 이유는?


상위 위젯에서 상태를 관리하는 이유

  • 여러 위젯이 동일한 상태를 공유해야 하는 경우, 개별 위젯이 개별 상태를 관리하게 되면 각 위젯이 따로 따로 상태를 관리하게 되어 일관성이 깨질 수 있음.
  • 상태가 변경될 때, 공유되는 상태가 일관성있게 변화되도록 상위 위젯에서 관리하는것이 더 좋음.
  • 개별 위젯마다 상태 관리하느라 StatefulWidget을 사용하게 되면, 각 위젯이 독립적으로 상태를 관리해야 해서 전체 프로젝트 복잡도가 올라갈 수 있음. 
  • 상위 위젯에서 하위 위젯들의 상태를 관리하도록 하면, 필요시에 특정 위젯만 다시 빌드되게 할 수 있음. 

 


 

2. 

다시 위젯 상태 관리로 돌아와서,

위에 참조한 문서를 조금 더 읽어 보았다.

 

위젯 상태 관리, 어떻게 해야 할까?

- 개별 위젯이 자기 상태를 독립 적으로 관리한다.

- 상위 위젯이 하위 위젯들의 상태를 통합적으로 관리해 준다.

- 위 두개 방식을 적절히 믹스 앤 매치 방식으로 섞어서 사용한다.

 

정답은 없다. 이건 답이 똑 떨어지는 수학 문제가 아닌 것이다.

우리는 위젯을 작성하는 일명 '위젯 디자이너'이기 때문에, 알아서 최적의 방식을 선택해서 가야 한다. 

하지만! 참조하면 좋을 규칙이 문서에 제시돼 있다. 

 

위 내용의 출처는 저기 상단 문서이다.

 

위의 내용에 따르면, 참고할 만한 규칙 둘이 있다. 

 

  • 첫 번째, 만약 상태 관리를 어떻게 할지 고민이 되는 위젯이 체크박스, 슬라이더 포인트 위치와 같은 유저 데이터라면 이건 부모 위젯에서 관리하는 것이 베스트일 수 있다. 
  • 두 번째, 만약 상태 관리가 고민되는 위젯이 애니메이션과 같이 aesthetic에 관한 것이라면- 예쁜 화면 만들기 용도이고, 이 상태가 외부 위젯에 영향을 미치지 않는 범위에 있다면-이 상태는 해당 위젯이 독립적으로 관리하는 것이 베스트일 수 있다. 

 

이 내용은 제가 마음대로 해석한 것이므로, 반박해 주신다면 독자님의 말씀이 옳습니다.

 


 

3.

SliderBox에서 숫자 변수 만들어서 사용할 때, int는 쓸 수 없다. double만 쓸 수 있다고 한다.

텍스트 위젯에 넣어서 표시할 때, toStringAsFixed(표시하고픈 소숫점 이하 자릿 수) 이러한 메서드를 사용하면 유용하다.

아래 코드에서는 정수값으로만 표시하고 싶어서 value.toStringAsFixed(0) 이렇게 사용하였다.

            Text(value.toStringAsFixed(0),
                style: TextStyle(
                  fontSize: 30,
                  fontWeight: FontWeight.bold,
                )),

 


 

4.

Boolean 타입의 변수명을 정할 때에는 run보다는 isRun, male 보다는 isMale 이 더 직관적이라고 한다. 꿀팁! (튜터님의 과제 피드백으로 배웠음)