본문 바로가기

Flutter

Flutter : 플러터 기존 프로젝트 2.0 으로 마이그레이션 하기

반응형

기존 Flutter 앱을 null safety를 지원하는 2.0으로 마이그레이션 해 보았습니다.

현재 앱의 dart 총 소스 라인은 1만 2천 라인 가까이 되는 프로젝트며 완벽한 마이그레이션까지 총 3일 정도 소요된 것 같습니다.

 

Flutter의 업그레이드 및 마이그레이션의 자세한 내용들은 아래 링크에 들어가시면 자세히 보실 수 있습니다.

https://dart.dev/null-safety/migration-guide

 

Migrating to null safety

How to move your existing Dart code to the world of null safety

dart.dev

우선 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

이상 간단하게 작성했지만 나름 엄청난 스트레스를 받았던 마이그레이션 작업이지만 향 후 업데이트를 생각하면 또 

무조건 적으로 안 할 수 없는 작업인 거 같습니다.

반응형