티스토리 뷰

Flutter

Flutter 2.0 마이그레이션

윈드. 2021. 11. 2. 12:26

flutter 2.0이 발표된지 일주일이 조금 지났습니다. 발표당일날까지만 해도 아직 null-safety를 지원하지 않던 라이브러리들이 이제는 많이 null-safety를 지원하기 시작했고, 저도 개발중이던 프로젝트를 2.0으로 upgrade해보기로 했습니다.

 

우선 새로운 업그레이드를 위해서 최신 버전의 flutter SDK를 다운로드 받아야 합니다. 혹시 기존에 기존에 다른 프로젝트를 1.x로 유지 해야 한다면, 기존 flutter SDK를 바로 업데이트 하기 보다는 2.0 SDK를 다운받은 후 필요한 프로젝트에만 target flutter path를 변경해서 사용하는게 좋겠습니다.

 

2.0 SDK를 다운받았다면 적절한 폴더에 압축을 푼 후 변경하고자 하는 버전의 flutter path를 변경합니다.

이제 사용중인 라이브러리들이 모두 null-safety를 지원하는지 알아 보겠습니다.

 


// 모든 라이브러리들이 null safety적용 되었는지 확인
$ dart pub outdated --mode=null-safety

// 자동으로 라이브러리들을 null-safety하게 upgrade
$ dart pub upgrade --null-safety

 

dart pub outdated --mode=null-safety를 수행했을대 "All your dependencies declare support for null-safety"로 메시지가 나온다면 migration을 진행할 수 있습니다. 만약 아직 특정 라이브러리가 아직 null-safety를 지원하지 않는 다면 직접 확인 후 다른 대체 가능한 라이브러리로 변경하게 좋을것 같습니다.

 

이제 우리 프로젝트에 null-safety옵션을 활성화하기 위해 pubspec.yaml파일의 enviroment를 아래와 같이 2.12.0이상으로 수정합니다.

 


environment
:

sdk: ">=2.12.0 <3.0.0"

 

이제 소스를 보면 수없이 많은 오류표시를 보시게 될것입니다.

친절하게도 dart에서 자동으로 null-safety 마이그레이션을 제공하고 있지만 가능하면 null-safety에 따른 변경 사항이 무엇인지 파악하기 위해서라도 직접 수정하기를 권장합니다.

생각보다 쉽게 수정이 가능하며, 여러분들 소스의 안전성을 한번더 파악하는 좋은 기회가 될수도 있습니다.

 

null-safety 오류유형

오류들을 확인하다 보면 일정한 패턴을 발결할 수 있습니다.

 

1. 함수인자

가장 많은 오류표시가 나는 부분으로 optinal argument로 설정한 것들은 모두 nullable로 선언해주거나 필수값을 지정해야 합니다. 만약 필수 값으로 설정하고 null을 받지 않는 다면 required를 앞에 붙입니다.

 


/// before

void sampleFunction({String idString title,
    String option01String option02}){
....
}
/// after
void sampleFunction({required String idrequired String title,
    String option01 = 'default'String? option02}){
....
}


/// ====================


/// before
void sampleFunction(String idString title, [String option01String option02]){
....
}
/// after
void sampleFunction(String idString title, [String option01 = 'default'String? option02]){


....
}

 

2. 클래스 맴버 변수 선언과 초기화

final로 선언하고 생성자에서 this.xx 으로 바로 선언하던 변수는 생성자에 requried를 붙여주어야 한다.

생성자의 body에서 초기화가 필요한 변수의 선언 클래스의 변수중 부득이하게 생성자에서 this을 사용해서 초기화가 필요하거 기타 다른 이유로 복잡한 초기화가 필요한지만 none-nullable로 사용하고 싶은 변수의 경우 이럴때는 late final로 선언해서 늦은 초기화로 선언하고 non-nullable로 사용 할 수 있다.

 


/// before

class Sample {
    final String id;
        SampleOption option;
        Sample({this.idString optionName}) {
        this.option = SampleOPtion(thisoptionName);  
    }
}
/// after
class Sample {
    final String id;
    late final SampleOption option;
    Sample({required this.idString? optionName}) {
        this.option = SampleOption(thisoptionName);
    }
}

 

3. Assert() 제거

인자로 들어오는 값의 null체크를 위해서 assert를 사용하는 경우를 많이 보았을 것입니다. 이제 null-safety가 적용되었으니 제거 해도 될것 같네요

 


/// before

class Sample {
    String title;
    Sample(this.title) : asset (title != null);
}


/// after
class Sample {
    String title;
    Sample(this.title);
}

결론

의외로 수정해야 되는 패턴이 많지 않습니다. 대부분의 경우 required, final, late, late final, ? 등으로 해결이 가능하며 변수의 의미를 더욱 명확하게 해주기 때문에 코드의 가독성을 높히고 오류의 가능성도 낮아 길것 같습니다. 자동으로 마이그레이션 하는 것보다는 수동마이그래에션을 통해 앞으로 2.0에서 어떻게 프로그램 해야 하는지를 익히시기 시기 바랍니다.

 

참고자료

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

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함