[flutter] FAQ
MaterialIcons-Regular.otf path error

Figure 1: path problem
이 에러의 해결법은 flutter sdk를 다시 까는 거라고 한다. 그냥 지우고 다시 해본다.
build settings
flutter project를 xcode에서 실행하게 되면, 다음과 같은 build settings를 적용하는 popup dialog가 나온다. recommend하는건, Quoted Frameheader와 enable Sandingbox가 check되어 있다. 그런데, 이렇게 수행하면, 아래에도 보겠지만, rsync나 import,included warning이 엄청 뜨게 된다. 그래서 아래와 같이 dialog에서 Build Settings에서 option을 check 해제하면 된다.

Figure 2: warning problem
rsync problem
flutter project에서 ios simulator를 동작시키기 위해서, xcode에서 runner project를 실행을 하게 되는데, 이 때 발생되는 에러다.

Figure 3: rsync problem
이 에러의 해결법은 xcode에서 runner target의 USER_SCRIPT_SANDINGBOX를 no로 선택하면 된다.

Figure 4: rsync problem2
git ignore 문제
flutter로 project를 만들고, ios simulator를 동작 시키면, xcode에서 실행을 위해서 다음과 같은 file을 만들어 낸다. 이 파일들은 artifacts라고 해서 부산물이다. xcode가 project를 실행하기 위해서 만들어내는 부산물인데, git에서 추적을 관리할 필요가 없다. pbxproj는 project build관련된 파일이고, xcscheme은 scheme과 관련한 파일이다. scheme이란건, 동일한 code base에서 free버전, paid버전, test 버전을 만들어내는 flavor를 뜻한다. 이것은 parameter나 configuration을 설정하면서 이루어지는데, parameter나 configuration은 git에 의해서 관리된다. xcscheme는 parameter나 configuration을 runtime에 실행할때 매번 만들어지기 때문에 git으로 관리될 필요가 없다.

Figure 5: git ignore
매번 ios simulator가 실행될 때, 만들어지는 파일을 git에서 관리하지 않으려면 .gitignore를 실행하면 된다. flutter project를 만들면 자동으로 만들어주는 .gitignore에 이 부분이 빠진듯하다. flutter의 공식 github repo에서 사용하는 .gitignore를 여기 에서 받아서 적용해준다. 적용 방법은 다음과 같다.
git rm -r --cached .
git add.
git commit -m "커밋메세지"
git push
version warning
이것은 xcode 초기 setting이 11.0으로 되어 있기 때문이다. 이것을 12.0으로 바꾸면 해결된다.
The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is
set to 11.0, but the range of supported deployment target versions is
12.0 to 17.0.99.
flutter package명
flutter로 package를 만들때, 명명 규칙이 있다. 소문자로 지어야 하고, -나 _를 사용한다. 다음 을 참조하자. 명명규칙이 다르면 다음과 같은 에러가 난다.

Figure 6: package name
color index 사용시 에러
Colors.grey[200]같은 표현을 사용할때 에러를 만났다.

Figure 7: colors error
invalid constant value error였는데, error의 정확한 표현은 다음과 같다.
[]를 사용하는 방법은 constant expression내에서 사용할 수 없다.
즉, 나는 const expression로 const Scaffold()를 사용했고 backgroundColor:라는 named parameter로 Colors.grey[200]이란 값을 사용했다. 여기서 문제가 되는것은 const로 객체를 생성하면 compile때 객체가 만들어져서 메모리에 올라가야 한다. 그런데 인자로 받는 Colors.grey[200]은 compile때 값이 결정되지 않고, runtime때 값이 만들어진다. 즉 Colors.grey[1000]이라고 하면 1000번 index에 해당하는 값이 미리 정해진게 아니라, runtime때 정해진다. 내가 궁금했던것은 materialColor값은 이미 전역적으로 const로 선언되어 있기 때문에, const expression에서 사용할 수 있고, 아무 문제가 없다고 생각했던 것이다.

Figure 8: const color
하지만, 배열에 의한 참조는 runtime에 결정되기 때문에 const로 설정되어 있어도 runtime때 결정된다고 한다. 나는 이부분이 이해가 안간다. 여튼 결론은 Colors.red나 Color(0x1E1E1E1E)같은 경우는 compile때 결정되고, Colors.red[200]은 runtime때 결정된다고 해야 이해가 된다.
이것에 대한 gpt답은 다음과 같다.

Figure 9: const color
system적으로 보면, flutter에서 표현하는 color값(Colors.red, Color(0x1e1e1e1e))의 경우에는 그 값을 사용해서 system이 color를 만들어 적용하는 반면에, Colors.red[200]의 경우에는 system color palette의 200번째 항목을 runtime때 찾아가야 한다고 한다. 그래서 runtime때 그 값이 결정된다.
const와 final의 차이를 이해해야 할 필요도 있다. const expression에선 compile때 그 계산이 완료되어야 하기 때문에, runtime때 완료되는 expression이 올수 없기 때문이다. flutter에선 가장 흔한 const expression의 예로, const 생성자가 있다. 이 생성자에서는 final expression이 올 수없다. const와 final의 차이의 예를 들면, const sum = 3+4는 compile때 완료된다면, final sum = 3+4는 runtime때 완료 된다. 여기서 3+4라는 expression만 본다면, 이것은 원래 compile때 완료되서, 명확한 const expression이다. 하지만, 그냥 예를 들어서 final sum = 3+4로 다뤘을 뿐이다. 위에서 colors.red[200]의 경우에는 system의 color palette를 이용한다. compile때는 그 값을 알수없다. runtime때 system에서 그값을 꺼내기 때문이다.
sonoma bug
m1에서 simulator가 가끔 버벅이거나 멈추는 현상, 한글 쓰는데 문제가 있다. sonoma 버그라고 한다. 다시 깔기로 한다. ventura로 다운그레이드했다.