본문 바로가기
반응형

분류 전체보기319

freezed 왜씀? dart data class를 사용하자! 1. Dart Data Class란? https://github.com/andrasferenczi/dart-data-plugin GitHub - andrasferenczi/dart-data-plugin: IDEA plugin for generating utility methods for Dart data classes IDEA plugin for generating utility methods for Dart data classes - andrasferenczi/dart-data-plugin github.com flutter에서 json 관련 클래스를 만드는건 아주 귀찮습니다. 이에 freezed를 많이 사용하는데요.. 사실 이 패키지도 몹시 불편합니다. 보일러플레이트 코드를 작성하고 거기다가 코드 제너.. 2024. 4. 16.
vim으로 flutter를 개발하는 원대한 꿈을 꿨다 vim으로 flutter를 개발하려는 원대한 꿈을 꿧다. 유튜브에서 한 외국인이 neovim으로 세팅한 영상을 보고 neovim 세팅에 대해 공부했다. 복잡한 세팅을 미리 다 해둔 nvchad와 lunarvim 같은 프로젝트 존재를 알게 되었고 nvchad 로 세팅을 마무리 하였다. 결과는 와우! 진짜 단축키 다 외우니 안드로이드 스튜디오보다 생산성이 훨씬 더 잘나왔다. vim flutter tools라는 플러그인은 생각보다 훨씬 잘 돌아갔고, lsp라는 프로토콜을 이용한 자동완성은 몹시 수준급이였다. 적어도 dart 영역에서는 말이다... 허나 나는 회사에서 네이티브 코드도 만질일이 있다. 이에 나는 코틀린과 스위프트까지 영역을 확장하려 했다. 거기서부터 문제였다. kotlin은 제대로 된 lsp가 없.. 2024. 3. 28.
NeoVim과 flutter 설정 먼저 nvim과 nvchad를 깔아준다 brew install nvim git clone https://github.com/NvChad/starter ~/.config/nvim && nvim 설치도중 permission error가 난다면 ~/.local/share와 ~/.local/state에 퍼미션 문제가 있다. chown -R 유저이름 nvim 을 해주어 권한을 가져오자 설치가 되었다면 아래 코드를 통해 lua lsp를 설치해주자. :MasonInstall lua-language-server 다음으로 ~/config/nvim으로 이동한다 그리고 lua/plugins/init.lua 파일을 연 뒤 flutter-tools 를 설치해준다 { 'akinsho/flutter-tools.nvim', lazy.. 2024. 3. 27.
Xcode에서 SwiftUI 코드선택 익숙해지기 1. 개요 안드로이드 스튜디오에서는 expand selection이라는걸 제공한다.커서기준으로 범위를 확장하면서 선택해주는 기능인데 flutter 개발할 때 매우 유용하다. 현재 내 커서가 위치한 위젯의 범위를 정확하게 선택가능기에 위젯들을 마치 레고 조립하듯이 코드를 작성할 수 있다. 헌데 Xcode에서는 그런 기능이 없다는것을 알았다... 너무 불편하다. 그래서 방법을 찾은 결과 결국 해답은 vim에 있었다. 2. 선택방법 여러가지 Va{ 혹은 Va}, vaBb 을 하면 플러터에서 하듯이 뷰의 전체를 선택가능하다 실제 vim에서는 vaBV를 해야한다. 고로 vaBV로 연습하자 va{ 혹은 va}, vaB을 하면 중괄호를 포함한 뷰의 바디부분을. 선택할 수 있다 vab는 소괄호 선택 vaB는 중괄호 선.. 2024. 3. 22.
[Swift] PropertyWrapper 사용법 https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/ Documentation docs.swift.org 1. PropertyWrapper란? 파이썬의 데코레이션과 비슷하다. 파이썬의 데코레이션은 코드 앞뒤로 어떠한 코드를 붙여주는 작업을 해준다. 프로퍼티 래퍼또한 비슷하다. 어떤 프로퍼티 앞뒤로 특정한 작업을 넣을 수 있다. 2. 만드는법 만드는 방법은 간단하다. 1. struct를 정의할 때 @PropertyWrapper라고 적어준다 2. struct안에 wrappedValue라는 computedProperty를 정의해주면 된다 아래는 범위가 12까지인 프로퍼티를 프로퍼티 래퍼를 이용해 구현하.. 2024. 3. 22.
[SwiftUI] StateObject, ObservedObject, EnvironmentObject 1. StateObject, ObservedObject란 값이 아닌 참조타입(클래스) 형태의 State를 관리할 때 사용된다. private으로 선언되어야 한다. memberwise initializer에서 설정되는걸 막기위한것 @Published 프로퍼티 래퍼를 사용한다 ObservableObject 프로토콜을 따른다 처음 한번 생성되면 뷰 라이프사이클 상관없이 계속해서 유지된다. 처음 이걸보고 struct로 이루어진 State와 뭐가다르지? 라고 생각하고 자료를 찾아봤는데... 명확하게 답변해주는 토픽이 하나도 없었다. 단지 class는 reference 타입이라는 점이 가장 큰 차이. 그 외에도 class가 struct 대비 가지고 있는 장점들이 워낙 많으니 그러한 차이들이 struct state와.. 2024. 3. 21.
[SwiftUI] 자식에게 State 전달하기 https://developer.apple.com/documentation/swiftui/managing-user-interface-state Managing user interface state | Apple Developer Documentation Encapsulate view-specific data within your app’s view hierarchy to make your views reusable. developer.apple.com 1. Binding 키워드 먼저 자식View에다가 @Binding 이라는 프로퍼티 래퍼를 생성한다. 이 프로퍼티 래퍼는 부모의 스테이트를 받아오는 역할을 한다 struct PlayButton: View { @Binding var isPlaying: Bool.. 2024. 3. 21.
SwiftUI에서 {} 동작 원리 너무 궁금해서 찾아보았다.. 먼저 var body의 경우 아래와 같이 View라는 프로토콜에서 정의되어있고 computed property로 사용된다 그럼 VStack은 어떻게 동작하는가? https://stackoverflow.com/questions/66704988/returning-multiple-view-objects-from-a-closure-in-swift Returning multiple View objects from a closure in Swift I often see code like this: VStack { Text("A") Text("B") } From looking at the swift tutorials, I know that this is shorthand for speci.. 2024. 3. 20.
[Swift] Generic이란 1. Generic Function 아래와 같은 함수를 보자. 인트 변수를 두개바꿔주는 함수이다. func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } 만약 정수형이 아니라 실수형을 바꿔주고 싶다면? 아래처럼 함수바디 구현체는 같은데 함수이름과 파라미터 자료형만 다른걸 세개나 정의해줘야 한다. func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } func swapTwoStrings(_ a: inout String, _ b: inout String) { let temporaryA = .. 2024. 3. 20.
[Swift] inout 파라미터 1. inout 파라미터란 스위프트는 기본적으로 함수 파라미터가 constant다. 함수 내에서 이 값을 바꾸려 하면 컴파일 에러가 난다. 그럼 스위프트에서 call by reference를 어떻게 하냐? inout 파라미터를 사용하면 가능하다. inout 파라미터는 함수를 호출할 때 &를 붙여주어야 한다. C언어처럼 func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, &anotherInt) print("someInt is now \(someInt), and anotherInt is no.. 2024. 3. 20.
[Swift] Protocol 배우기 https://docs.swift.org/swift-book/documentation/the-swift-programming-language/protocols/ Documentation docs.swift.org 1. 프로토콜이란? 그냥 다른언어 인터페이스랑 똑같다고 생각하면 된다. 그런데 Swift 이놈은 용어가 너무 다르다. 생긴건 아래와 같다 protocol SomeProtocol { var mustBeSettable: Int { get set } var doesNotNeedToBeSettable: Int { get } } protocol AnotherProtocol { static var someTypeProperty: Int { get set } } 프로토콜 안에있는 변수들은 Property R.. 2024. 3. 19.
iOS 디벨로퍼 계정없이 무료 빌드하는법 뭔가 정책이 풀린건지 이제 개발자 계정 없이 앱빌드가 가능해진것 같다. 이전에도 가능했으나 앱이 1주일후면 블락처리되고 그랬는데... 그래 애플씨. 좀 유하게 삽시다. 치사하게 굴지 말고 요약하면 다음과 같다 1. 먼저 디벨로퍼 사이트에 내 애플계정을 가입한다. 돈은 내지 말자 2. 디벨로퍼 사이트에 가입하면, 사이닝 페이지에 내 이름이 personel team으로 등록이 된다 3. 이를 이용하면 디버그용에 한해서 무료 빌드가 가능하다. 4. 앱을 빌드하고 디바이스에 올리면 신뢰할 수 없는 개발자라고 나온다. 5. 설정에 가서 안드로이드처럼 개발자 신뢰함을 설정하면 개발이 가능하다 2024. 3. 19.
CustomPainter를 redraw 하는 방법 https://api.flutter.dev/flutter/rendering/CustomPainter-class.html CustomPainter class - rendering library - Dart API The interface used by CustomPaint (in the widgets library) and RenderCustomPaint (in the rendering library). To implement a custom painter, either subclass or implement this interface to define your custom paint delegate. CustomPainter subclasses must impl api.flutter.dev 공식문서에서는.. 2024. 3. 15.
덩치가 커진 위젯의 rebuild 플러터를 하다보면 하나의 위젯이 덩치가 어마어마하게 커지는 경우가 있다. 이때 setState를 하면 어마어마한 퍼포먼스 문제를 야기한다. 헌데 위젯을 하나하나 따로 빼서 끊어주고 생성자 뚫고 해주는게 여간 쉬운일이 아니다. 이럴 때 사용하는 팁을 적어본다 1. 프로파이더 사용 너무나 당연한 얘기이지만 프로바이더를 사용하면 커다란 빌드 함수 안에서 특정 위젯만 리빌드 할 수 있다. 다만 코드 작성하기가 여간 귀찮다 2. 스트림 컨트롤러와 스트림 빌더 사용 가장 쉬운 방법이다. 특정부분만 리빌드 하고 싶은 부분을 스트림 빌더로 감싸준다. 그리고 스트림컨트롤러르 생성한 뒤 스트림을 스트림빌더에만 내려준다. 즉 특정부분만 setState 하는 효과를 가지게 된다. 3. ChangeNotifier와 Listen.. 2024. 3. 8.
iOS에서 로그 볼때 OR, NOT 필터 거는법 XCode에서 로그를 볼 때 안드로이드와 다르게 iOS에서는 필터를 걸면 죄다 and이거나 죄다 OR로 설정할 수 있다. Match any conditions로 설정하면 로그필터 조건들이 죄다 OR로 설정된다 Match all conditions 로 설정하면 로그필터들이 죄다 and로 설정된다 이건 좀 짜증나네.. 반면 Device and Simulator에 들어가서 로그를 보면 서로다른 항목에 대해서는 AND로 동작하고, 같은 항목에 대해서는 or로 동작한다 가령 PROCESS Runner MESSAGE msg1 MESSAGE msg2 라고 하면 프로세스가 Runner이고 메세지가 msg1 msg2 이거 둘중 하나를 포함하는걸 필터링 하라 이다 2. Not 필터 거는법 Xcode에서 필터 설정후 옆에 .. 2024. 2. 8.
[iOS] Static Library만들기와 사용 1. 프로젝트 만들기 Xcode에서 Static 라이브러리를 선택하고 언어를 선택한다. 오브젝트C는 언어가 그지같으니 스위프트 선택 그럼 이렇게 프로젝트가 생성되는데 열심히 코드를 작성해주자 2. 빌드하기 빌드 타겟을 정해주고 Product->build 혹은 Start버튼으로 빌드 해주자. 여기서 주의할건, iOS, iOS 시뮬레이터, 아이패드, 맥북등 타겟마다 다 따로 설정해줘서 빌드해야 한다. 본인이 원하는 타겟에 따라 적절히 선택해주자 빌드가 완료되면 Product -> show Build Folder in Finder를 선택해주자. 그럼 아래와 같이 파일들이 나온다 여기서 봐야할건 .a 파일과 swiftmodule이다. 둘다 사용되므로 다 챙기자! 3. 다른 프로젝트에서 사용하기 먼저 아래에 Bu.. 2024. 2. 8.
iOS에서 상하단에 색이 생길 때 해결방법 1. 문제의 원인 아주 간단하다. Scaffold 바로 위에 SafeArea를 설정하면 아이폰에서 상하단에 흰색이나 검은색이 생긴다 2. 해결방법 SafeArea를 body로 옮겨주자 2024. 2. 3.
PageRouteBuilder에서 iOS backSwipe가 안될 때 https://github.com/flutter/flutter/issues/47441 Cupertino back gesture are disabled when using PageRouteBuilder · Issue #47441 · flutter/flutter Use case I am using PageRouteBuilder to add fade transition to some of my routes. I've noticed however that the swipe to go back on IOS is not working when doing so! Which is something I'm used to ... github.com 1. 문제점 PageRouteBuider를 이용해 화면전환시 애니메이션을 .. 2024. 2. 3.
Bottom에서 Pull to refresh하기 방법을 찾아보다가 결론은 직접 만들어서 써야 한다. 아이디어는 다음과 같다. 스크롤 컨트롤러의 position값을 추적해 offset을 구한다 offset을 0에서 1.1 사이로 nomarlize한다 refresh indicator를 partially하게 0.1단위 간격으로 값을 보내어 위젯을 다시 그리도록 한다 1.1이 될 경우 데이터를 불러오고 refresh indicaotr를 full로 그린다. 대충 코드로 설명하는게 편할듯 먼저 일단 나의 위젯이 사이즈가 너무 커져서 그냥 setState할경우 디버그모드에서 버벅이는게 보였다. 고로 하위 위젯만 rebuild 될 수 있도록 StreamController와 StreamBuilder를 활용하기로 하였다. double _bounceProgress = 0.. 2024. 1. 31.
3차원 회전행렬 구하기 및 캘리브레이션 가속도 센서를 캘리브레이션 할 일이 생겨서 만들어 보았다. 지피티는 신이다. 아래 함수들 전부 검증해보고 제대로 동작하는 것 확인하였다. data class Vector3D(val x: Double, val y: Double, val z: Double) fun normalize(vector: Vector3D): Vector3D { val length = sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z) return Vector3D(vector.x / length, vector.y / length, vector.z / length) } fun dotProduct(vector1: Vector3D, vector2: Vector3D): .. 2024. 1. 26.
반응형