import 'package:flutter/services.dart';
void main(){
SystemChrome.setPreferredOrientations([])).then((){});
...
즉, 선호하는 방향은 set하겠다는 함수로 인수로는 사용자에게 제공할 방향들을 List로서 제공하면 된다.
즉, 여기에 명시되지 않은 방향들은 방지된다.
이제 해당 함수가 Promise 처럼 Future 객체를 반환하기 때문에 이를 .then이나 await으로 받아서 해결해줘야한다.
그리고 .then은 항상 함수를 return한다.
따라서 여기서는 setPreferredOrientations 즉, 선호하는 방향이 설정되면 그 다음(.then()
)에 앱을 실행(run) 해줘야한다.
SystemChrome.setPreferredOrientations
이 정상적으로 로그인 되고 그 다음(.then()
) runApp이 작동한다.반응형 앱이란 레이아웃과 스타일이 사용 가능한 공간과 사용 가능한 너비 앱이 실행되는 모드에 맞춰 조정되는 앱이다.
즉, portait 모드와 landscape 모드 모두 지원하는 앱이 바로 반응형 앱이다.
Expanded
)기본적으노 Column은 세로를 최대한 가져가려고 하고 Row는 가로를 최대한으로 가져가려고 한다.
하지만 Scaffold를 이용한다면 애초에 높이값과 너비값을 디바이스에 맞추기 때문에 추가적으로 Expanded 위젯을 사용할 일이 없다.
그리고 높이값과 너비값을 각각 비교하여 더 작은 것을 최종 높이와 너비로 가져간다.
즉, 이 말은 Column의 높이값은 자식과 상관이 없어지게 된다. 이말은 column은 높이값을 row는 너비값을 지정하지 않으면 자식이 무한하게 공간을 차지하려고 한다면 뻑난다는 뜻이다.
viewInsets은 다른 UI를 덮어씌운 UI에 대한 추가정보를 담고 있다.
즉, 위 코드는 키보드가 차지하는 양 만큼의 길이를 얻을 수 있다는 것이다.
하지만 위 코드를 자세 보면 매우 하드코딩 되어있는 padding을 볼 수 있다. 이는 카메라가 달려있는 핸드폰 특성상 카메라 부분의 값을 padding을 준 것인데 이는 각 기종마다 다른 것을 감안하면 매우 불완전한 코드이다. 이를 방지하기위해 존재하는 것이 바로 showModalBottomSheet라는 플러터에서 제공하는 함수 내부의 useSafeArea
속성값이다.
이 속성값만 넣어주면 알아서 flutter에서 상위 상태창을 계산해서 그 값 만큼을 확보해준다.
constraints가 나타내는 바는 현재 위젯의 부모위젯으로부터 어떠한 제약조건(constraint)를 받고있는지 담고 있는 객체이다.
constaint가 사용 가능한 공간이 얼마나 되는지 정확히 알 수 있고 또 이것으로 어떤 레이아웃을 렌더링할지 결정할 수 있다.
사용 가능한 화면 너비나 높이는 신경 쓰지 않아도 된다. 왜? constraint 객체 내에 다 담겨있지 때문이다.
여기서 매우 중요한 것은!!!
빌더는 제약 조건이 바뀔 때마다 빌더 함수를 호출한다.
이는 위젯이 다른 곳으로 이동하거나 최소 너비와 최대 너비 값이 바뀌면 즉, 예를 들어 장치 방향을 바꾸면 UI가 업데이트된다는 뜻이다.
이제 LayoutBUilder위젯을 사용하면 부모 위젯만 신경 쓰면 된다.