flutter의 dart-define은 2.2 이상에서는 base64로 인코딩되므로 대응하는 스크립트 소개

11376 단어 Flutter
안녕하세요. 모구메트 입니다.



호텔에 있던 말이 너무 신경이 쓰여서, 무심코 가르쳐 버렸습니다.

최근 flutter를 괴롭히고 있고 Flutter 업데이트에 의한 함정을 받았으므로 공유하겠습니다.

여러분 dart-define을 아십니까?
dart-define을 사용하면 환경별로 설정 파일 등을 전환할 수 있습니다.

구체적인 순서에 관해서는 아래의 기사가 참고가 됩니다.



이번에는 상기의 순서에서는 Flutter1.17까지의 방법 밖에 기재되어 있지 않았습니다만, 아래 기사에서 Flutter2.2로부터의 순서도 있었기 때문에 dart-define의 업데이트에 관한 부분만 발췌해 소개합니다.

dart-define의 표현 역사



dart-define의 역사는 다음과 같이 바뀌었습니다.
  • Flutter1.17 ~ : 모든 DartDefine을 쉼표로 결합 된 단일 문자열 값으로 전달합니다.
    DEFINEEXAMPLE_APP_NAME=awesomeApp1,DEFINEEXAMPLE_APP_SUFFIX=.dev
    
  • Flutter 1.20 ~ : 컴파일러에 전달되기 전에 URI 기호를 인코딩합니다.
    DEFINEEXAMPLE_APP_NAME%3Dawesome1,DEFINEEXAMPLE_APP_SUFFIX%3D.dev
    
  • Flutter 2.2 ~ : 각 변수는 base64로 인코딩됩니다.
    REVGSU5FRVhBTVBMRV9BUFBfTkFNRT1hd2Vzb21lMg==,REVGSU5FRVhBTVBMRV9BUFBfU1VGRklYPS5kZXY=
    

    스크립트



    표현 방법의 변경에 맞추어 android의 gradle이나 ios의 pre build script등도 변경하지 않으면 안 됩니다.
    (이러한 스크립트의 사용법은 서두에 소개한 기사를 참고해 주세요!)

    Android (gradle)



    flutter1.17.gradle
    def dartEnvironmentVariables = [
        DEFINEEXAMPLE_APP_NAME: 'awesomeApp',
        DEFINEEXAMPLE_APP_SUFFIX: null
    ];
    if (project.hasProperty('dart-defines')) {
        dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
            .split(',')
            .collectEntries { entry ->
                def pair = entry.split('=')
                [(pair.first()): pair.last()]
            }
    }
    

    Flutter1.20.gradle
    if (project.hasProperty('dart-defines')) {
        dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
            .split(',')
            .collectEntries { entry ->
                def pair = URLDecoder.decode(entry).split('=')
                [(pair.first()): pair.last()]
            }
    }
    

    Flutter2.2.gradle
    if (project.hasProperty('dart-defines')) {
        dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
                .split(',')
                .collectEntries { entry ->
                    def pair = new String(entry.decodeBase64(), 'UTF-8').split('=')
                    [(pair.first()): pair.last()]
                }
    }
    

    iOS



    Flutter1.17.sh
    echo "$DART_DEFINES" | tr ',' '\n' > ${SRCROOT}/Flutter/Defineexample.xcconfig
    

    Flutter1.20.sh
    function urldecode() { : "${*//+/ }"; echo "${_//%/\\x}"; }
    
    IFS=',' read -r -a define_items <<< "$DART_DEFINES"
    
    for index in "${!define_items[@]}"
    do
        define_items[$index]=$(urldecode "${define_items[$index]}");
    done
    
    printf "%s\n" "${define_items[@]}"|grep '^DEFINEEXAMPLE_' > ${SRCROOT}/Flutter/Defineexample.xcconfig
    

    Flutter2.2.sh
    function entry_decode() { echo "${*}" | base64 --decode; }
    
    IFS=',' read -r -a define_items <<< "$DART_DEFINES"
    
    
    for index in "${!define_items[@]}"
    do
        define_items[$index]=$(entry_decode "${define_items[$index]}");
    done
    
    printf "%s\n" "${define_items[@]}"|grep '^DEFINEEXAMPLE_' > ${SRCROOT}/Flutter/Defineexample.xcconfig
    

    요약



    Flutter 버전에 맞게 스크립트를 수정해야하므로 dart-define을 사용할 때는주의하십시오.

    마지막으로, 원나이트인 늑대 온라인 라는 게임을 만들고 있습니다! 좋으면 놀아주세요!

    그 밖에도 카메콘 이나 Offcha 라고 하는 서비스도 만들고 있으므로 좋으면 사용해 주세요!



    또, 팀 빌딩이나 기술 고문, Firebase의 설계나 어드바이스등의 이야기도 접수하고 있으므로 어용의 분은 당사에 문의해 주세요.
  • 좋은 웹페이지 즐겨찾기