What’s new in Flutter 3.19

Hong JongPyo
Flutter Seoul
Published in
17 min readFeb 28, 2024

Gemini API, Impeller 업데이트 및 Windows Arm64 지원을 통한 앱 개발 혁신

안녕하세요? Flutter Seoul의 HDD입니다.
2월 16일에 공개된 Flutter 3.19 의 변경사항들에 대해 번역을 arcanine님과 함께 진행했습니다.

그 외에도 Dart 3.13 버전과 Flutter 2024년 로드맵이 궁금하다면 아래의 링크를 통해 보실 수 있습니다.

👉 What’s new in Dart 3.3
👉 Flutter 2024 Roadmap

오늘은 새로운 Flutter 릴리즈인 3.19를 소개합니다. 이번 릴리즈에서는 Gemini용 새로운 Dart SDK, 개발자가 위젯 애니메이션에 세밀한 제어를 추가할 수 있는 위젯, 임펠러 업데이트를 통한 렌더링 향상, 딥 링크 구현에 도움이 되는 툴링, Windows Arm 64 지원 등을 제공합니다.

168명의 커뮤니티 멤버가 1429건의 풀 리퀘스트를 병합하고 43명의 커뮤니티 멤버가 첫 Flutter 풀 리퀘스트를 커밋하는 등 Flutter 커뮤니티는 계속해서 감동을 선사하고 있습니다!

이번 최신 릴리즈에 Flutter 커뮤니티가 기여한 새로운 추가 사항과 개선 사항에 대해 자세히 알아보려면 계속 읽어보세요!

AI integration

Gemini Google AI Dart SDK 베타 출시

Google AI Dart SDK가 베타 버전으로 출시되었습니다. 이를 통해 Google의 최신 AI 모델 제품군인 Gemini로 구동되는 생성형 AI 기능을 Dart 또는 Flutter 앱에 구축할 수 있습니다.

pub.dev에 google_generative_ai 패키지가 있습니다.

Google AI Dart SDK를 함께 빌드하는 방법을 더 자세히 알아보려면
이 블로그 게시물 이나 Dart QuickStart로 바로 이동하세요.

프레임워크

스크롤 개선사항

Flutter는 이전에 두 손가락으로 드래그하면 스크롤 속도가 두 배로 빨라졌습니다. 이제 MultiTouchDragStrategy.latestPointer를 사용하여 기본 ScrollBehavior를 구성함으로써 손가락 수에 구애받지 않는 스크롤 동작을 얻을 수 있습니다. 이 변경에 대한 자세한 내용은 마이그레이션 가이드를 참조하세요.

또한, SingleChildScrollViewReorderableList에 대한 버그 수정을 완료하여, 다수의 보고된 충돌과 예상치 못한 동작들을 해결했습니다.

2차원 스크롤에서는, 어느 방향으로든 스크롤이 진행 중일 때 드래그하거나 탭하면 스크롤 활동이 예상대로 멈추도록 문제를 해결했습니다.

two_dimensional_scrollables 패키지의 TableView 위젯도 마지막 릴리스 이후 업데이트되었으며, 더 많이 다듬었으며, 병합된 셀을 지원하며, 마지막 안정 릴리스 3.16 이후의 2D 기반의 새로운 기능들을 더 많이 채택했습니다.

애니메이션 스타일

Flutter 커뮤니티 멤버 @TahaTesser의 기여로 덕분에 Flutter에는 MaterialApp, ExpansionTile, PopupMenuButton과 같은 위젯에서 기본 애니메이션 동작을 재정의할 수 있는 새로운 AnimationStyle 위젯이 추가되었습니다. 이를 통해 개발자들은 애니메이션 곡선과 지속 시간을 재정의할 수 있는 능력을 갖게 됩니다.

SegmentedButton.styleFrom

Flutter 커뮤니티 멤버 @AcarFurkan이 다른 버튼 타입들이 제공하는 것과 같은 styleFrom 정적 유틸리티 메소드를 추가했습니다. 이 메소드는 SegmentedButton의 ButtonStyle을 빠르게 생성하여 다른 세그먼트 버튼과 공유하거나 앱의 SegmentedButtonTheme을 구성하는 데 사용할 수 있게 합니다.

Adaptive Switch

이 적응형 컴포넌트는 macOS와 iOS에서 네이티브처럼 보이고 느껴지며, 다른 곳에서는 Material Design의 모양과 느낌을 가집니다. Cupertino 라이브러리에 의존하지 않으므로 모든 플랫폼에서 API가 정확히 동일합니다.

Adaptive Switch Pull RequestSwitch.adaptive 생성자 API 페이지의 라이브 예제를 확인하세요.

SemanticsProperties 접근성 식별자

SemanticsProperties의 새로운 접근성 식별자는 네이티브 접근성 계층에서 시맨틱 노드를 위한 식별자를 제공합니다. Android에서는 접근성 계층에서 resource-id로 나타나며, iOS에서는 UIAccessibilityElement.accessibilityIdentifier를 설정합니다. 이 변경은 엔진프레임워크에 걸쳐 있었으며, 커뮤니티 멤버 @bartekpacia에게 감사를 표합니다.

텍스트 위젯 상태에 대한 접근성 증가

TextFieldTextFormFieldMaterialStatesController를 지원하게 되어 MaterialState 변경사항을 듣을 수 있게 되었습니다.

UndoHistory stack

일본어 키보드에서 실행 취소/다시 실행 기록이 사라질 수 있는 문제수정했습니다. 이제 UndoHistory 스택에 푸시되기 전에 항목을 수정할 수 있습니다.

Engine

Impeller 진행 상황

Android OpenGL preview

3.16 stable 릴리즈에서는 Vulkan을 지원하는 Android 기기에서 Impeller 를 사용해보도록 초대하여 Android 기기의 77% 에 해당하는 기기를 지원했습니다. 지난 몇 달 동안 Impeller의 OpenGL 백엔드는 MSAA 지원

을 추가하는 등 Vulkan 백엔드와 동등한 수준의 기능을 갖추도록 개선했습니다. 즉, 커스텀 셰이더 및 외부 텍스처에 대한 완전한 지원 등 몇 가지 기능을 제외하고 거의 모든 Android 기기에서 Flutter 앱이 올바르게 렌더링 될 것으로 예상됩니다.

Flutter 개발자에게 최신 Stable 버전으로 업그레이드하고, Impeller 활성화 를사용했을 때 관찰되는 단점에 대해 문제를 제기해주시기 바랍니다. 이 단계에서 피드백은 Impeller가 Android 에서 성공적으로 작동하고 올해 말 릴리즈에서 기본 렌더러로 자신 있게 사용할 수 있도록 하는데 매우 중요합니다. Android 하드웨어 생태계는 iOS 생태계보다 훨씬 더 다양합니다. 따라서 Impeller에 대한 가장 유용한 피드백에는 문제가 발생한 특정 디바이스와 Android 버전에 대한 자세한 정보가 포함되어야 합니다.

또한, 다시 한 번 말씀드리지만 Impeller의 Vulkan 백엔드는 Skia에서 사용되는 것 외에 debug 빌드에서 추가 디버깅을 지원하며 이러한 기능은 추가적인 런타임 오버헤드를 유발합니다. 따라서 profile 또는 release 빌드에서 Impeller의 성능에 대한 피드백을 제공하는 것이 중요합니다.

버그 리포트에는 개발자 도구의 타임라인과 동일한 기기에서 Skia 백엔드와의 비교가 포함되어야합니다. 마지막으로, 언제나 그렇듯이 문제를 입증하는 재현 가능한 소규모 테스트 사례를 포함한 피드백을 보내주시면 대단히 감사하겠습니다.

Roadmap

렌더링 충실도에 이어 Impeller의 Android 프리뷰 기간 동안 가장 중점을 둔 부분은 성능입니다. 점진적인 개선이 계속되고 있지만 몇 가지 큰 개선 작업도 진행중입니다. Vulkan subpasses를 활용하여 고급 블렌드 모드의 성능을 크게 개선하는 작업이 진행중입니다. 또한 렌더링 전략을 항상 CPU의 모든 경로를 tessellating 하는 방식에서 Stencil-then-cover 방식으로 변경하면 Android와 iOS 모두에서 Impeller의 CPU 사용률을 크게 줄일 수 있을 것으로 예상합니다. 마지막으로 Gaussian blurring 의 새로운 구현이 Skia 구현의 처리량과 일치하고 iOS에서 blurring의 관용적 사용이 개선될 것으로 예상합니다.

API 개선 사항

Glyph Information

이번 릴리즈에는 dart:uiParagrap 객체에 대한 두가지 새로운 메소드 getClosestGlyphInfoForOffset, getGlyphInfoAt 가 추가되어 각각 새로운 유형 GlyphInfo 객체를 반환합니다.

새로운 GlyphInfo 유형에 대한 설명서를 확인하세요.

GPU tracing

Flutter 엔진은 Metal (iOS, macOs, Simulator) 및 Vulkan 지원 Android 기기들의 Impeller에서 debug 및 profile 빌드의 타임라인에서 각 프레임에 대한 GPU 시간을 나타냅니다.

GPU 프레임 타이밍은 DevTools의 GPUTracer 에서 검사해볼 수 있습니다.

Vulkan이 아닌 Android 기기는 GPU 타이밍 쿼리 지원을 잘못 나타낼 수 있으므로 이러한 기기들에서는 AndroidManifest.xml파일에 플래그를 설정해야만 Impeller의 GPU 추적을 활성화할 수 있다는 점에 유의하세요.

<meta-data 
android:name="io.flutter.embedding.android.EnableOpenGLGPUTracing"
android:value="true" />

성능 최적화

Specialization constants

Impeller에 특수화 상수(specialization constants)에 대한 지원을 추가했습니다. Impeller’s shaders 에서 이 기능을 활용하면 Flutter 엔진의 비압축 바이너리 크기가 350KB 가까이 줄어듭니다.

Backdrop filter 속도 향상

아직 해야할 일이 훨씬 더 많지만, 이번 릴리즈에는 Impeller의 backdrop filter와 blur에 대한 몇가지 멋진 성능 개선사항이 포함되어 있습니다. 특히, 오픈소스 기여자 @knopp는 Impeller가 화면 텍스처에서 읽는 기능을 잘못 요청하고 있다는 사실을 발견했습니다. 이 기능을 제거하자 여러 backdrop filter가 포함된 장면이 벤치마크에서 복잡도에 따라 20~70%까지 개선되었습니다.

또한 Impeller는 더 이상 모든 backdrop filter에 무조건 stencil buffer를 저장하지 않습니다.

대신, 작업에 영향을 미치는 모든 클립이 기록되고 backdrop filter 의 save layer를 복원할 때 새 stencil buffer 버퍼로 저장됩니다.

이 변경 사항으로 인해 Vulkan 백엔드가 Impeller를 실행하는 Pixel 7 Pro의 애니메이션 고급 블렌드 모드 벤치마크에서 평균 GPU 프레임 시간은 55ms 에서 16ms로, 90%-ile(퍼센타일) 레스터 쓰레드 CPU 시간은 약 110ms에서 22ms로 개선되었습니다.

Android

Deeplinking web validator (딥링크 유효성 검사 도구)

개발자들로부터 딥링크(웹 URL에서 모바일 앱의 특정 페이지로 사용자를 이동시키는 것)은 구현하기 어렵고 오류가 발생하기 쉽다는 사실을 알게 되었습니다. 그래서 먼저 개발자가 어떤 링크가 잘못 구성되었는지 파악하고 구현 지침을 제공하는 유효성 검사 도구를 만들었습니다.

이제 Flutter 딥링크 유효성 검사 도구의 초기 버전을 사용할 수 있게 되어 매우 기쁘게 생각합니다.

이 초기 버전에서 딥링크 유효성 검사 도구는 Android 에서 웹 검사를 지원하며, 이는 assetlinks.json 파일의 설정을 검증하는 것을 의미합니다. DevTools를 열고 Deep Links 탭을 클릭한 다음 딥링크가 포함된 Flutter 프로젝트를 가져오면 됩니다. 딥링크 유효성 검사 도구는 웹 파일이 올바르게 구성되었는지 여부를 알려줍니다

자세한 내용은 딥링크 유효성 검사 도구 테스트 지침 을 참조하세요.

이 도구가 딥링크 구현 여정을 간소화하는 첫 걸음이 되길 바랍니다. 향후 iOS의 웹 검사 및 iOS, Android 모두 앱 검사에 대한 지원을 제공하기 위해 계속 노력할 것입니다!

Support for Share.invoke

텍스트 필드와 뷰의 기본 공유 버튼은 이전에는 Android에서 누락되었지만, 각 플랫폼에서 모든 기본 컨텍스트 메뉴 버튼을 사용할 수 있도록 하기 위한 지속적인 노력의 일환으로 이번 릴리즈에 추가되었습니다.

현재 진행중인 작업은 PR #107578 에서 확인할 수 있습니다.

네이티브 에셋 기능

Flutter 코드에서 다른 언어의 함수와 Flutter의 상호 운용성에 관심이 있는 경우, 이제 네이티브 에셋 지원을 위해 진행중인 작업 의 일환으로 Android 에서 네이티브 에셋을 통해 FFI 호출을 수행할 수 있습니다.

Texture Layer Hybrid Composition (TLHC) mode

Flutter 3.19에는 이제 Google 지도와 텍스트 입력 확대기가 TLHC 모드에서 작동하도록 하는 작업이 포함되어 있어 앱의 성능이 향상됩니다. Google 지도를 사용 중이시라면 변경 사항을 테스트 해보시고 피드백 해주시기 바랍니다.

이 작업에는 프레임워크 또는 엔진에 대한 커밋이 포함되어 있지 않지만, PR 5408 에서 THLC 테스트 단계와 함께 작업 내용을 확인할 수 있습니다.

Custom system-wide text selection toolbar buttons

(시스템 전체 텍스트 선택 툴바 사용자 지정)

Android 앱은 모든 텍스트 선택 메뉴(텍스트를 길게 누르면 나타나는 메뉴)에 표시되는 사용자 지정 텍스트 선택 메뉴 항목을 추가할 수 있습니다. 이제 Flutter의 TextField 선택 메뉴에 이러한 항목이 통합됩니다.

iOS

Flutter iOS native fonts

이제 iOS에서 Flutter 텍스트가 좀 더 간결하고 네이티브처럼 보입니다. Apple의 디자인 가이드에 따르면 iOS에서 작은 폰트는 모바일에서 읽기 쉽도록 더 넓게 펼쳐야 하고, 큰 글꼴은 공간을 많이 차지하지 않도록 더 빽빽하게(compact) 만들어야합니다.

이전에는 모든 경우에 더 작고 간격이 넓은 글꼴을 잘못 사용했습니다. 이제 Flutter는 기본적으로 큰 텍스트에 빽빽한(compact) 글꼴을 사용합니다.

DevTools

DevTools 업데이트

이번 릴리즈에서 DevTools의 주요 특징은 다음과 같습니다:

  • 안드로이드에서 딥링크 설정의 유효성을 검사하는 새로운 기능과 화면이 DevTools에 추가되었습니다.
  • Platform Channel 활동 추적을 위한 Enhance Tracing(추적 향상) 옵션이 메뉴에 추가되었습니다. 플러그인이 있는 앱에 유용합니다.
  • 이제 연결된 앱이 없을 때도 Performance 및 CPU profiler 화면을 사용할 수 있습니다. 이전에 저장된 Performance data 혹은 CPU profiles를 다시 로드하여 화면에서 볼 수 있습니다.
  • VS Code의 Flutter Sidebar에서 현재 프로젝트에 활성화 되지 않은 새 플랫폼을 활성화 할 수 있으며, Sidebar의 DevTools 메뉴에 외부 브라우저 창에서 DevTools를 열 수 있는 옵션이 추가되었습니다.

자세한 내용은 개발자 도구 2.29.0, 2.30.0, 2.31.0 릴리즈 노트에서 확인하세요.

Desktop

Windows Arm64 지원

커뮤니티 회원인 @pbo-linaro 의 훌륭한 노력 덕분에 이제 Windows의 Flutter가 Arm64 아키텍처에 대한 초기 지원을 수용하게 되었습니다. 이 초기 지원은 Windows Arm64 디바이스에서 기본적으로 실행되는 보다 효율적이고 성능이 뛰어난 Flutter Application을 위한 기반을 마련합니다.

아직 개발중이지만 GitHub issue #62597 에서 진행 상황을 추적할 수 있으며, 이번 조치는 더 다양한 Windows 기기에 앱을 최적화 하려는 Flutter 개발자에게 유망한 개선사항을 의미합니다.

Ecosystem

Required reason privacy manifest

이제 Flutter는 향후 애플의 요구사항을 충족하기 위해 iOS에 privacy manifest 를 포함합니다.

Flutter 및 Dart 패키지 ecosystem 진행상황

놓치셨다면 1월의 블로그 게시물에서 Flutter 및 Dart 패키지 ecosystem 진행상황을 확인해보세요.

Deprecations and breaking changes

Windows 7 및 8 지원중단

Flutter가 발전함에 따라 Dart 3.3 및 Flutter 3.19 릴리즈에서 Windows 7 및 8에 대한 지원을 종료하여 최신기술에 집중할 수 있게 되어 기쁩니다. Microsoft의 전략에 따라 이러한 변화를 통해 최신 운영 체제에서 Flutter를 개선할 수 있게 되었습니다. 개발자들의 조정에 감사드리며 이러한 전환 과정에서 여러분을 지원하기 위해 최선을 다하고 있습니다.

이번 조치로 지원중인 Windows 버전에서 더욱 안전하고 효율적이며 풍부한 기능을 갖춘 개발환경을 구축할 수 있는 기반을 마련하게 되었습니다. Flutter 생태계에서 함께 혁신을 지속하는 동안 여러분의 이해와 적응에 감사드립니다.

Impeller dithering flag

3.16 Stable 릴리즈 노트에서 언급했듯이 글로벌 플래그 Paint.enableDithering제거되었습니다.

자세한 내용은 웹사이트의 변경 사항 공지를 참조하세요.

iOS 11 사용 중단

특정 네트워킹 API가 호출될 때 런타임 충돌로 인해 Flutter는 더 이상 iOS 11을 지원하지 않습니다.

즉, Flutter 3.16.6 이상으로 빌드된 앱은 해당 기기에서 실행되지 않습니다.

auto render mode 사용 중단

이번 릴리즈의 Breaking changes 에는 v3.16 릴리즈 이후 사용 기간이 만료된 더 이상 사용되지 않는 API가 포함되어 있습니다. 영향을 받는 모든 API에 대한 추가적인 맥락과 마이그레이션 지침을 보려면 deprecation guide for this release(해당 버전에 대한 사용 중단 가이드)를 참조하세요. 사용 중단의 대부분은 IDE의 QuickFix를 포함하여 Flutter fix 가 지원됩니다. dart fix CLI 명령어를 사용하여 일괄 수정 사항을 평가하고 적용할 수 있습니다.

항상 그럿듯이 contributing tests를 제공해 주시는 커뮤니티에 많은 감사드립니다. — 이를 통해 획기적인 변경사항을 파악할 수 있습니다. 자세한 내용은 Flutter’s breaking change policy.을 참조하세요.

결론

이 공지사항을 시작할 때 놀라운 수의 기여자를 강조한 것은 의도된 것이었습니다. Flutter가 지금의 강력하고 효율 적인 툴킷으로 진화할 수 있었던 것은 놀라운 커뮤니티의 헌신과 노력의 증거입니다. 모든 분들께 진심으로 감사드립니다.

이번 릴리즈에 추가된 기능에 대해 자세히 알아보려면 release notes and change log 에서 Flutter 3.19에 추가된 기능들을 확인해보세요.

Flutter 3.19는 Dart 3.3과 함께 Stable 채널에서 사용할 수 있습니다. flutter upgrade 명령어를 실행하는 것 만큼이나 간단하게 새로운 여정을 시작할 수 있습니다.

긴 내용 읽어주셔서 감사합니다.

번역이 잘못되거나, 수정되면 좋겠다는 부분이 있다면 편하게 말씀해주시면 감사하겠습니다.

--

--