기존 Flutter 앱을 null safety를 지원하는 2.0으로 마이그레이션 해 보았습니다.
현재 앱의 dart 총 소스 라인은 1만 2천 라인 가까이 되는 프로젝트며 완벽한 마이그레이션까지 총 3일 정도 소요된 것 같습니다.
Flutter의 업그레이드 및 마이그레이션의 자세한 내용들은 아래 링크에 들어가시면 자세히 보실 수 있습니다.
https://dart.dev/null-safety/migration-guide
우선 Flutter 2.0으로 업그레이드는 Flutter 홈페이지에서 2.0을 받아와 기존 하드의 Flutter 폴더는 다른 이름으로 변경 후 기존 폴더 위치로 압축을 풀어 주었으며 이후 cmd창에서 flutter doctor -v로 체크 확인만 했습니다.
다음으로 기존 앱에서 사용되는 dependencies들의 2.0 호환 여부 체크 입니다.
앱이 있는 폴더로 이동 후 cmd창을 여신 후
dart pub outdated --mode=null-safety
검사해 보시면 지원 여부를 확인해 보실 수 있습니다.
Resolving...
Showing dependencies that are currently not opted in to null-safety.
[✗] indicates versions without null safety support.
[✓] indicates versions opting in to null safety.
Computing null safety support...
Package Name Current Upgradable Resolvable Latest
direct dependencies:
app_settings ✗4.0.4 - ✓4.1.0 ✓4.1.0
cloud_firestore ✗0.16.0+1 - ✓1.0.6 ✓1.0.6
cupertino_icons ✗1.0.0 - ✓1.0.2 ✓1.0.2
date_format ✗1.0.9 - ✓2.0.2 ✓2.0.2
equatable ✗1.2.6 - ✓2.0.0 ✓2.0.0
firebase_auth ✗0.20.0+1 - ✓1.1.1 ✓1.1.1
firebase_core ✗0.7.0 - ✓1.0.4 ✓1.0.4
firebase_storage ✗7.0.0 - ✓8.0.4 ✓8.0.4
flutter_html ✗1.2.0 - ✓2.0.0-nullsafety.0 ✓2.0.0-nullsafety.0
flutter_svg ✗0.19.1 - ✓0.21.0+1 ✓0.22.0
fluttertoast ✗7.1.6 - ✓8.0.6 ✓8.0.6
font_awesome_flutter ✗8.11.0 - ✓9.0.0 ✓9.0.0
geolocator ✗6.1.14 - ✓7.0.3 ✓7.0.3
get ✗3.26.0 - ✓4.1.4 ✓4.1.4
google_maps_flutter ✗1.2.0 - ✓2.0.3 ✓2.0.3
google_mobile_ads ✗0.11.0+4 - ✓0.12.1+1 ✓0.12.1+1
google_sign_in ✗4.5.9 - ✓5.0.2 ✓5.0.2
http ✗0.12.2 - ✓0.13.1 ✓0.13.1
image_picker ✗0.6.7+22 - ✓0.7.4 ✓0.7.4
intl ✗0.16.1 - ✓0.17.0 ✓0.17.0
json_annotation ✗3.1.1 - ✓4.0.1 ✓4.0.1
lottie ✗0.7.0+1 - ✓1.0.1 ✓1.0.1
pattern_formatter ✗1.0.2 - ✓2.0.0 ✓2.0.0
permission_handler ✗5.0.1+1 - ✓7.0.0 ✓7.0.0
photo_view ✗0.10.3 - ✓0.11.1 ✓0.11.1
provider ✗4.3.3 - ✓5.0.0 ✓5.0.0
sa_multi_tween ✗1.2.0 - ✓2.0.0-nullsafety.0 ✓2.0.0-nullsafety.0
share ✗0.6.5+4 - ✓2.0.1 ✓2.0.1
shared_preferences ✗0.5.12+4 - ✓2.0.5 ✓2.0.5
simple_animations ✗2.5.0 - ✓3.1.1 ✓3.1.1
sqflite ✗1.3.2+2 - ✓2.0.0+3 ✓2.0.0+3
theme_provider ✗0.4.0+1 - ✓0.5.0 ✓0.5.0
url_launcher ✗5.7.10 - ✓6.0.3 ✓6.0.3
dev_dependencies:
build_runner - - ✓2.0.1 ✓2.0.1
json_serializable ✗3.5.1 - ✓4.1.1 ✓4.1.1
No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.
34 dependencies are constrained to versions that are older than a resolvable version.
To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
Latest에 보시면 현재의 버전들이 다 null safety를 지원되고 있습니다.
만약 X로 표시되는 분들은 null safety를 지원할 때까지 기다려 보시거나 호환 가능한 다른 Package로 변경하시기 바랍니다.
cmd 창에서
dart pub upgrade --null-safety
해주시면 기존 버전을 null safety 버전으로 변경시켜 줍니다.
이후 작업이 완료되면
dart pub get
을 이용하며 새로운 버전의 Package로 교체해 줍니다.
여기까지 오셨다면 이제 정말 기존 프로젝트를 2.0으로 마이그레이션 할 차례입니다.
cmd 창에서
dart migrate
2.0으로 마이그레이션 시켜 줍니다.
이 과정에서 전 에러가 생겨 잠시 진행을 못했는데 이유가 위젯이 deprecated 된 경우 예를 들어 FlatButton이나 OutlineButton의 경우 다음 과정에서 수정이 가능하기 때문에 마이그레이션에서 문제가 되지 않지만
위젯 기능 중 deprecated 된 경우엔 진행이 안됩니다.
예로
Scaffold 위젯 안의
backgroundColor: 는 빨간 밑줄이 없지만
resizeToAvoidBottomPadding: 의 아래엔 빨간 밑줄이 나와 있습니다.
resizeToAvoidBottomPadding 이 deprecated 되어 더 이상 기능을 지원하지 않거나 다른 기능으로 대체되어 나오는 결과입니다.
이런 부분은 마이그레션 전에 수정을 해주셔야 진행이 가능합니다.
resizeToAvoidBottomPadding -> resizeToAvoidBottomInset: 로 대체해 주시면 됩니다.
저 같은 경우 몇 개 더 있었는데 구글링으로 다 해결했습니다.
참고로 resizeToAvoidBottomPadding 기능은 키보드가 올라오면서 생기는 여백의 문제를 없애주는 기능입니다.
이런 문제들이 해결되었다면 이제 진짜 마이그레이션 하시면 됩니다.
문제없이 진행되었다면
View the migration suggestions by visiting:
http://127.0.0.1:60278/Users/you/project/mypkg.console-simple?authToken=Xfz0jvpyeMI%3D
사이트 주소가 하나 열리며 cmd 창에서 마우스로 클릭하시면 해당 주소로 이동됩니다.
그러면 현재 앱의 null safety로 변경된 소스를 확인하실 수 있습니다.
참고 화면
위 화면에서 오른쪽 상단의 Apply Migration 버튼을 클릭하시면 수정 작업이 완료됩니다.
수정 후 pubspec.yaml 파일의
sdk 버전을 수정해 줍니다.
environment:
sdk: '>=2.12.0 <3.0.0'
한 번 더 cmd 창에서
dart pub get
해 주시면 Flutter 2.0 마이그레이션은 끝이 납니다.
이렇게 끝나면 3일이나 소요될 일이 뭐가 있나 생각하시겠지만 문제는 이제부터 시작입니다.
우선 deprecated 된 위젯을 수정해 주셔야 하며 또한
저 같은 경우 SQL Database 및 Firebase의 사용자 인증 문제 및 기타 몇 가지로 인해 앱에 문제가 생겼습니다.
Firebase의 경우 구글 로그인만 문제가 있어 검색을 통해 수정했으며
Firebase를 이용한 게시판은 문제없이 작동했습니다.
SQL Database의 경우 아래 동영상을 참고 해 수정했습니다.
https://www.youtube.com/watch?v=UpKrhZ0Hppk&list=PL77V7Z29O5P4ADS7Zz7HYDyRHpPZuJfvm&index=36&t=191s
이상 간단하게 작성했지만 나름 엄청난 스트레스를 받았던 마이그레이션 작업이지만 향 후 업데이트를 생각하면 또
무조건 적으로 안 할 수 없는 작업인 거 같습니다.
'Flutter' 카테고리의 다른 글
플러터(Flutter) - 이미지 메뉴(Image Menu) (0) | 2022.01.17 |
---|---|
플러터(Flutter) - 앱의 폰트 크기 유지 (0) | 2021.05.01 |
플러터(Flutter) - SnackBar 사용 (0) | 2021.01.30 |
플러터(Flutter) - Generate signed apk fails with build\app\intermediates\flutter\profile\libs.jar 오류 (0) | 2021.01.27 |
Flutter - CurvedNavigationBar(네비게이션바) 구현 (0) | 2020.11.26 |