Flutter 16

[Flutter] iOS Native에서 Flutter로 Realm 데이터베이스 Migration 하기

네이티브로 운용되던 프로젝트를 플러터로 변경할 때가 있다. 그럴 때는 네이티브 내에 있던 데이터들을 가져와야할 필요가 있기 때문에 마이그레이션을 진행해야 한다. 이 경우에는 Realm 데이터베이스를 사용하는 경우를 예를 들었다. Realm 데이터베이스를 마이그레이션 하는 것과 비슷하다. 세팅 iOS의 경우. class Dog: Object { @Persisted var name: String @Persisted var age: Int } let realm = try! Realm() try! realm.write { let dog = Dog() dog.name = "poppy" dog.age = 1 realm.add(dog) let dog1 = Dog() dog1.name = "choco" dog1.age..

Flutter 2024.03.16

[Flutter] 상태관리 - Provider

상태관리 상태관리는 왜 하는가. 상위에서부터 주입해서 오려면 생성자에 들어가는 매개변수가 너무 많다. 이 부분을 따로 빼서 관리하기 위함. Provider 상태관리 라이브러리. runApp(ChangeNotifierProvider( create: (_) => MainViewModel(), child: const MyApp(), )); 가장 상위에서 주입을 해줄 수 있다. 서브 트리에서도 주입을 할 수 있다. 여기서 뷰 모델은 ChangeNotifier를 채택해야한다. class MainViewModel extends ChangeNotifier 이걸 하면 flutter가 import된다. 뷰를 알면 안된다고 생각해서 방법을 찾아봤지만 방법이 없다. riverpod을 사용하면 걷어낼 수 있다고 한다. Con..

Flutter 2024.01.02

[Dart] 기본 - Future

Future 비동기 프로그래밍에 사용되는 기능 Future 로 사용하는데 미래에 T 타입의 값이 들어온다. void main(List arguments) async { print(await futureInt()); // await이 없다면 완성된 상태가 아니기 때문에 Future instance가 나온다. } Future futureInt() async { return Future(() { print('완료'); return 3; }); // delay를 통해 실행 한다면 Duration이 지난 후 완료된다. } Completed 상태와 Uncompleted 상태가 있다. 완료되기 전에는 그저 Future Instance 이지만 완료된다면 T타입의 값이 들어온다. 실행 중 에러가 발생한다면 에러를 담고 ..

Flutter/Dart 2023.12.15

[Dart] 기본 - Error Handling

Error try-catch 또는 try-on-catch class SomeError implements Exception { String message; SomeError(this.message); } enum AppError { notParseToInt; Exception get error { switch (this) { case AppError.notParseToInt: return SomeError('int 타입으로 변경할 수 없습니다.'); } } } enum으로 관리한다. 팀원과 생각한 패턴이지만 나쁘지 않은 것 같다. get은 다양한 Error들을 지원하기 위해 Exception 타입을 반환하도록 한다. try { num = int.parse(string); } catch(e) { throw..

Flutter/Dart 2023.12.11

[Dart] 기본 - Enum

Enum enumerated type 또는 enum. 열거형. 값을 나열한 것. constant한 값들을 고정해서 표현하는 것. 고정. 변경이 불가하다. enum Planet { mercury(planetNumber: 1), venus(planetNumber: 2), earth(planetNumber: 3), mars(planetNumber: 4), jupiter(planetNumber: 5), saturn(planetNumber: 6), uranus(planetNumber: 7), neptune(planetNumber: 8); final int planetNumber; String get description { switch (this) { case Planet.mercury: return '온도가 높..

Flutter/Dart 2023.12.08

[Dart] 기본 - HashCode

HashCode A string representation of this object. 오브젝트를 표현하는 문자. 라고 공식문서에서 말하지만 리턴값은 int다. 오브젝트를 표현하는 문자로 해쉬코드를 사용할 수 있다. 하지만 기본적으로 == 연산자는 (identityHashCode)을 통해 확인할 수 있는 완전히 동일한 객체일 때에만 true를 반환하게 되어있다. HashCode와는 관계 없다. identical() 메서드를 이용한다. "진짜" 같은 객체인지 비교한다. Dart Data Class 플러그인을 활용한 기본 == 코드 class SomeObject { final int a, b, c; SomeObject(this.a, this.b, this.c); @override bool operator =..

Flutter/Dart 2023.12.07

[Dart] 기본 - 추상클래스, 인터페이스

다트는 문법상 이상한 부분이 많다. 공식문서조차 틀린다. (class modifier) 믿을 수 없다. 두가지만 용도에 맞게 사용한다. abstract class 추상 클래스. 인스턴스 생성 불가능하다. 상속 가능하다. 확장의 용도로만 사용하자. abstract class BaseTranslator { String mapperTo(int data) { return data.toString(); } } class MoreFeatureTranslator extends BaseTranslator { void moreFeature() {} } abstract interface class 인터페이스. 추상화를 주 목적으로 사용하자. abstract interface class ViewModel { Output t..

Flutter/Dart 2023.12.05

[Dart] 기본 - Object vs dynamic

Object null을 제외한 다트의 모든 타입의 최상위 부모 hashcode String toString() bool operator ==() 이 여기에 구현되어 있다. 관련링크 dynamic 클래스가 아니다! 비슷해보이지만 다르다. dynamic 타입은 Object처럼 모든 객체의 부모이다. 타입의 모든 멤버는 주어진 주소에 승인해서 상호작용할 수 있는 어떤 시그니처로 접근을 하는데 dynamic은 다르다. 예를들어 리시버(인스턴스 , 변수 등)가 어떤 dynamic 타입이 평범한 메서드를 호출한다면 매개변수가 있던 없던, 해당 메서드가 있던 없던 호출을 할 수 있다. 이후 컴파일 타임에서 에러가 있다면 오류를 발생시킨다. 어떤 타입 어노테이션이 주어지지 않는다면 시스템은 해당 타입을 dynamic으..

Flutter/Dart 2023.12.04

[Dart] 기본 - Memory

다트의 GC가 메모리의 주소를 바꿀 수 있기 때문에 앱의 변수가 저장된 실제 메모리의 주소를 볼 수 있는 방법은 없다. 이는 GC 기반의 언어들이 공통점? 관련링크 그렇기 때문에 유추할 수 밖에 없다. 다트의 모든 객체는 힙에 저장된다. (from 공식문서) 기본적으로 Memory의 영역에 따라 Code, Data, Bss, Heap, Stack 으로 나누어 생각한다. Code, Data, BSS는 컴파일 타임에 크기가 결정된다. Heap, Stack은 런타임중에 크기가 계속 변한다. Code : 함수, 조건문, 등 코드를 저장한다. Data : 초기화 된 전역변수를 저장한다. BSS : 초기화 되지 않은 전역변수를 저장한다. Heap : 동적할당되는 것들을 저장된다. (클래스의 인스턴스 등) Stack..

Flutter/Dart 2023.12.02