플러터 레이아웃플러터 렌더링 엔진은 한 가지 정해진 레이아웃 시스템을 사용하지 않는다는 특징이 있다.위젯은 뷰를 묘사하는 고수준 클래스이며, 위젯을 화면에 그리는 부분은 저수준 객체가 담당한다.Row와 ColumnColumn, Row 위젯으로 플렉시블 레이아웃을 활용할 수 있다.Column은 자식들을 열로 배치하고, Row는 행으로 배치한다.레이아웃 제약 조건플러터는 UI 라이브러리이며, 렌더링 엔진이기 때문에 레이아웃 제약 조건은 중요한 개념이다.플러터 개발 중에 flutter layout in-finite size(플러터 레이아웃 무한 크기)에 대한 오류를 겪게 된다.제약 조건이 어떻게 동작하는지 이해하여, 오류에 대응해야 한다.RenderObject이 클래스는 내부에서 사용되는 클래스이므로 플러터 ..
플러터 프로젝트 구조플러터 프로젝트를 만들면 디렉터리가 생성된다.모든 디렉터리를 알 필요는 없으며, 사용하지 않는 디렉터리도 있다.counter_app=> android => ios=> lib => main.dart // 프로젝트 진입점, main을 포함=> test // 비즈니스 로직 검증 => widget_test.dart=> pubspec.yaml // 모든 다트 프로젝트에 필수, 의존성과 메타데이터 관리=> pubspec.lock // 편집하면 안 되는 잠금 파일 생성 => README.md플러터 앱 내부플러터의 많은 기능은 다트 라이브러리로 이루어져 있다.구글의 머티리얼 디자인 시스템 기본 위젯을 사용할 수 있다.앱 진입점앱의 맨 윗부분에 main 함수를 선언한다.runApp이라는 메서드로 최상..
다트 프로그램 내부모든 다트 프로그램은 main 함수를 반드시 정의해야 한다.모든 변수는 형식을 가져야 하며, 형식(or void)를 반환해야 한다.입출력과 다트 라이브러리다양한 라이브러리를 제공하지만, dart:core 라이브러리만 자동 로드된다.dart:html, dart:async, dart:math 등 다양한 라이브러리를 사용할 수 있다.dart:io를 활용하여 서버 응용프로그램이나 명령줄 응용프로그램을 구현할 수 있다.import 'dart:io';void main() { stdout.writeln('Greet Somebody'); String? input = stdin.readLineSync(); return helloDart(input);}void helloDart(String? nam..
플러터플러터는 구글에서 만들어 오픈 소스로 공개한 모바일 SDK다.렌더링 엔진, UI 컴포넌트, 테스트 프레임워크 도구, 라우터 등 앱을 만드는 데 필요한 모든 기능을 제공하는 플랫폼이다.플러터를 활용하면 개발자는 앱 특유의 도메인 기능에만 집중할 수 있다.플러터와 다트다트는 플러터를 위한 프로그래밍 언어로 생산성이 좋고 예측 가능하다.다트는 객체지향이므로 마크업 언어를 사용하지 않고, 다트 언어만으로 사용자 경험을 구현할 수 있다.다트는 JIT(just-in-time) 컴파일과 AOT(ahead-of-time) 컴파일을 모두 지원한다.AOT 컴파일러다트 코드를 효율적인 네이티브 코드로 전환대부분의 기능을 커스터마이즈JIT 컴파일러핫 리로드 지원빠른 개발 속도와 반복을 지원누가 플러터를 사용할까?개인 개..
플로우 테스트Flow를 반환하는 대부분의 함수는 Flow를 반환하는 다른 함수를 호출합니다.이는 데이터 → 도메인 레이어로 Flow 반환과 뷰 모델에서 UI 모델로의 전환에서도 적용됩니다.이러한 함수들을 어떻게 테스트하는지 직접 구현해봤습니다.비즈니스 로직테스트를 위한 로직을 구현하였습니다.ObserveAppointmentsService는 비즈니스 로직을 포함하고 있습니다.레퍼지토리 저장소로부터 Flow 데이터를 반환받아, 다양한 연산 후 재반환합니다.// Sealed Class 정의sealed class Appointment { data class AppointmentsUpdate(val appointments: List) : Appointment() data object Appointmen..
개요일반적으로 플로우는 콜드 데이터이기 때문에 요청할 때마다 값이 계산됩니다.여러 개의 수신자가 하나의 데이터가 변경되는지 감지하는 경우도 있습니다.이 경우 메일링 리스트와 비슷한 개념인 SharedFlow를 활용할 수 있습니다.StateFlow는 감지 가능한 값과 비슷하게 동작합니다.SharedFlow공유플로우를 통해 메시지를 보내면, 대기하고 있는 모든 코루틴이 수신하게 됩니다.이는 브로드캐스트 채널과 비슷하게 동작합니다.replay마지막으로 전송한 값들을 저장할 수를 지정합니다.(default:0)relayCache값을 저장한 캐시를 나타냅니다.resetReplayCache저장한 캐시를 초기화하는 경우 활용합니다.suspend fun main(): Unit = coroutineScope { /..