Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

전체 213

[소셜차트] 앱 제작기 #13. 좋아요 기능 (Distributed Counter)

하아... 누가 간단한 KiCad 알바 좀 하자고 해서 했는데;;; 2주를 날렸어... ㅠㅠ 화딱지나... 암튼 앱 개발 속행!! 좋아요! 기능은 매우 보편적이지.. 그런데 이게 은근히 짜증나... 우선 누가 좋아요를 눌렀는지 기록해야하고, 그리고 몇개의 좋아요인지도 알아내야 해. 난 firestore를 사용중이니 그걸 기준으로 하자면 단순하게 좋아요를 누른 사람을 기록하는 건 간단해. 그냥 sub collection 하나 만들고 user id를 포함한 문서를 계속 더하거나 빼면 되니까. 그런데 말이지.... 다른 DB는 모르겠지만 적어도 firestore에서는 좋아요를 카운트하는 일은 간단하지가 않아;; 왜냐하면 firestore에서 허용되는 문서 업데이트 주기가 초당 1회이기 때문이지;; 전세계에서 ..

[Firestore] Distributed Counter

허용되는 Firestore 문서 업데이트 주기가 초당 1회야. 초당 1회를 넘어가면 보장을 못한다는 거겠지? 음.. 그러면 "좋아요, 👍, ❤️" 같은 거 구현하려면 망하겠네? 유명한 인플루언서가 올리면 좋아요? 하트? 가 미칠듯이 찍힐테니까 말이야 ㅋㅋ 이 문제를 해결하기 위해서 firebase 공홈에서 추천하는 방법이 분산 카운터야. https://firebase.google.com/docs/firestore/solutions/counters 분산 카운터 | Firestore | Firebase Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기 이 페이지는 Cloud Translation AP..

[Flutter] Firestore pagination(무한스크롤)

무한 스크롤 같은 거 구현할 때 스크롤이 끝부분에 다달았을 때 DB나 API 서버를 통해서 새로운 데이터를 가져와야 하잖아? 이런 걸 Pagination이라고 해. 보통 리스트 형태의 데이터를 뿌려주는 API 들은 page 옵션이 별도로 있어. 그래서 pagination 구현할 때 그 page 옵션을 사용하면 되지. page 옵션이 없더라도 특정 데이터의 날짜를 기준삼아 정렬하고 읽어온 데이터 갯수를 pagination에 활용할 수도 있어. 뭐 API 서버는 이렇다 치고, Firestore에서도 여러가지 pagination을 위한 기능을 제공하고 있어.👇👇 https://firebase.google.com/docs/firestore/query-data/query-cursors 쿼리 커서로 데이터 페이지 ..

[소셜차트] 앱 제작기 #12. 댓글 기능 & 기타 잡다!

사실 이제 소셜차트의 핵심적인 부분을 구현해야 하는데.. 그건 아직 생각이 정리가 안되서 ㅋㅋㅋ 눈에 보이는 것들부터 우선 처리하고 있어. 유저가 포스팅을 하는 건 했으니 이제 댓글을 달아 보자고.. 포스팅이랑은 다르게 댓글은 그냥 keyboard에 붙어 다니는 bottomsheet에 textfield를 붙여서 구현했어. 물론 수정해야할 것들이나 추가해야 할 것들이 매우 많지만 일단 기능 구현에만 중점을 두고 작업했고 댓글 리스트를 위한 위젯은 유저 포스팅 리스트에 사용했던 infinite_scroll_pagination을 또 사용했어. infinite_scroll_pagination 매우 좋아! 이거 하면서 골때렸던게 keyboard를 따라다니는 bottomsheet 였는데 일반적으로는 매우 완벽하게 ..

[Flutter] Bad state: Future already completed

나같은 경우 네트워크에서 로드하는 이미지의 사이즈를 이미 알아내서 위젯을 그릴려고 completer를 사용했는데 가끔씩 이미지 로드에 실패하고 Bad state: Future already completed라는 에러가 뜨더라고;;;; 코드는 아래와 같은데 어떤 이유에서건 imageProfiver listener가 여러번 수행되서 그런 거 같아. ... CachedNetworkImage( imageUrl: imageUrl, width: 50, imageBuilder: (context, imageProvider) { Completer completer = Completer(); imageProvider .resolve(const ImageConfiguration()) .addListener(ImageStre..

[소셜차트] 앱 제작기 #11. 운수 좋은 날..

이제는 대가리가 Flutter에 맞춰지는지 스트레스도 덜 받고 왠지 모르게 이런 저런 것들을 잡다한 것들을 마이 했단 말이지.. infinite scroll 새로 고침, user profile에 더미 데이터 => DB 연결, insight card에 사용자 정보 가져오기, link preview Image provider에 에러 수정.. 뭐 한참 많아.. 크으~ 오늘 운이 좋은 걸? 이런 날일수록 조심해야지! % git add . % git commit -m "블라블라" % git push origin main 크 완벽해! ... 집에서 맥북으로 보니까 ios 폴더에서 저짓을 해놨네?;;;; 으하하하하하미ㅏ넝리ㅏㅓㅁ닝러ㅣㅁ나렁 사무실 컴터에 남아있을건데 왜 그러냐고?? ㅋㅋㅋㅋㅋㅋ 난 사무실에는 맥 스튜..

[소셜차트] 앱 제작기 #10. Tap to scroll top

bottom tab navigator에서 tab을 누르면 스크롤이 처음으로 올라가고, 또 tab을 누르면 뒤로가기. IOS에서 흔한 동작이야.. 그런데 ㅋㅋㅋㅋ 결론부터 이야기 하자면 못했어..... ㅅㅂ... React Native에서는 react navigation으로 여차저차 구현했는데;;; Flutter에서는 좌절이네;;; ㅋㅋㅋㅋ 다 내 머리가 나쁜 탓이지! ㅠㅠㅠㅠㅠㅠㅠㅠ 사실 flutter에서 scroll on top 기능은 간단해.👇 controller.scrollController.animateTo( 0.0, duration: const Duration(milliseconds: 300), curve: Curves.linear, ); //or controller.scrollControlle..

[소셜차트] 앱 제작기 #9. 무한 스크롤

유저가 작성한 인사이트 카드를 여러사람에게 맞춰 보여주는 건 쉽지 않은 일이겠지? ㅋㅋ 아마 Query가 마이 복잡해 질거야. 앱에서 firestore에 다이렉트로 못 할 수도 있고.. 이럴 경우에는 Backend에서 해야겠지. 그렇다고 손놓고 있으면 등신이고. 걍 일단 시간순으로 정렬해서 listview로 보여주자고.. Insight card는 단순하게 header, body, bottom 이렇게 3부분으로 나뉘는데 header에는 chart의 요약 정보가 들어갈거고 body에는 유저, 카드 내용이, 그리고 bottom에는 스크랩, 댓글 달기, 외부 공유를 할 수 있는 버튼이 있어. header와 bottom은 구현해야할 게 엄청 많으니까 일단 body만 읽어와서 뿌려줄건데 처음에는 귀엽게 10개를 고..

[소셜차트] 앱 제작기 #8. 글쓰는 페이지

일단은 지금 제작중인 소셜차트라는 앱이 소셜네트워킹 앱이어서 사용자들이 글을 쓸 수 있도록 해야 해. 페이스북이나 트위터처럼 말이지. 이거 말고도 구현해야 할 것들이 굉장히 많지만 글을 쓸 수 있는 환경부터 만드는 게 더미 데이터를 넣으면서 테스트하기 좋을 거 같아서 글쓰는 페이지부터 만들고 있어. 1차적으로 해쉬태그와 url을 자동으로 인식해서 link preview를 보여주는 정도로만 구현중이야. 먼저 textfield에 hashtag와 url을 꾸며주는 건 detactable_text_field라는 flutter package를 사용했고👇 https://pub.dev/packages/detectable_text_field detectable_text_field | Flutter Package Tex..

[Flutter] getx page&controller 재사용

get으로 Page랑 controller를 만들고 이걸 여러 군데에서 재사용해야 할 때가 있어. 뭐 Page(Widget)야 그냥 쓰면 되는데 GetxController의 instance가 독립적으로 생성되게 하기 위해서는 binding할 때 tag 옵션을 줘야해. 예를 만들어 보자구. 먼저 3개의 파일을 만들었어. page_text.dart, page_text_controller.dart 마지막으로 page_text_binding.dart get으로 page 기본 구성이라고 할 수 있어. 내용은 아래와 같고, //page_test.dart class PageTest extends GetView {//Getview로 선언하면 const PageTest({super.key}); static const ro..

반응형