본문 바로가기

코딩

(102)
Kotlin DSL을 이해해보자 - 1. 확장함수타입 TL; DR DSL을 만들 때 인자로 넣는 Person.() -> Unit 은 확장함수타입이다. 확장함수를 인자로 넘겨주기 때문에 간략한 코드를 만들 수 있다. Kotlin DSL을 간단하게 말하자면 gradle의 dependencies를 보면 된다 dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version") implementation("org.koin:koin-android:1.0.2") . . . } 이렇게 dependencies의 블록 안에 실행하고자 하는 코드를 한줄 한줄 '선언'처럼 적어두게 하여 '명령형'이 아닌 '선언형'으로 코딩하게 하는 것이다. (Kotlin in action, pg.479)..
헤더가 찰싹 달라 붙는 스크롤 뷰 (Sticky Scroll View) Fixed view in scroll view 네이버 앱을 보면 이렇게, 검색창이 위로 올라가다가 맨 위에 도달하면 더이상 올라가지 않고 고정이 된다. 실제로 네이버 앱 내부적으로는 CollapsingToolbarLayout을 이용하고 있을 수도 있다. 하지만, 만약 단순히 뷰를 고정시키기만 하고싶거나, 툴바는 다른 이유로 따로 쓰고 싶을 경우에는 CollapsingToolbarLayout를 사용하지 못한다. 그래서 이번에는 스크롤 뷰 내부의 임의의 뷰를 천장에 찰싹 달라 붙게 하는 커스텀 뷰를 만들어 보기로 하자. 전체 코드는 https://github.com/5seunghoon/Sticky_Scroll_View_Example 에 있고, 이번에는 https://github.com/amarjain07/S..
Android DiffUtil 리사이클러뷰를 쓰다가 아이템의 구성이 바뀔때, "아이템이 어디가 바뀌었지... 아... 몰라 notifyDataSetChanged!" 라는 생각을 하며 notifyDataSetChanged()를 호출하곤 해버린다. 물론 좋지 않은 일이지만.. 어쩔수 없다. 나는 멍청이니까. 하지만 이런 멍청한 코딩이 꽤 많았는지, 안드로이드에는 이러한 걸 도와주는 유틸이 있다. DiffUtil이라고 해서, 리사이클러뷰의 데이터 셋이 어떻게 바뀌었는지를 파악하고 그러한 변화를 리사이클러뷰에 던져줌으로써 프로그래머가 데이터 셋의 어느 부분이 구체적으로 변하였는지를 신경 쓰지 않게 도와준다. 자세한 내용은 뒤로 미루고, 어떤 결과가 나오는지, 어떻게 쓰는지부터 살펴보자. 이 움짤은, 5*5의 그리드 뷰에서 단순히 셔플을 하고..
Gradle : implementation VS compileOnly 안드로이드의 의존성을 관리하는 gradle을 이용하게 되면 습관적으로 implementation을 사용하게 된다. 그런데 여러 모듈을 개발하고 해당 모듈의 aar을 이용하여 개발을 만약 하게 된다면, 의존성 충돌때문에 빌드가 되지 않는 경우를 경험할 수 있을 것이다. 예를 들면 이렇다. 메인 프로젝트 : rxjava는 jar을 통해 implemetation, rxandroid는 aar을 통해 implementation, 그 외에 여러가지 jar, aar 파일을 implementation filetree를 통해 의존 서브 모듈 : rxjava와 rxandroid를 마찬가지로 jar과 aar을 통해 의존 이런 프로젝트에서 서브 모듈을 aar로 빌드한 뒤 메인프로젝트에 넣고 메인프로젝트를 빌드하면 rxjava..
Flutter - 현재 위젯 캡쳐(캡처) 현재 위젯을 캡쳐하는 방법을 알아보자. 안드로이드였다면 onDraw를 썼을테지만.. 플러터엔 그런거 없다..! 다만, renderObject를 활용하면 된다. 전체 소스 코드는 https://github.com/5seunghoon/Flutter_Capture_Example 여기에 있다. 1. 먼저 import부터. import 'dart:io'; import 'dart:async'; import 'dart:ui' as ui; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'pac..
플러터 - Status bar만 남기고 App bar는 지우기 Appbar를 지우려고 return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( appBar: new AppBar(), body: Center( child: Text("Hi"), )), ); 이런 코드에서 appbar만 지우면 쓸대없게도 status bar도 같이 사라진다. 이럴땐, primary: true, appBar: EmptyAppBar(), body: Center( child: Text("Hi"), )); 이런식으로 EmptyAppBar를 넣어주고, class EmptyAppBar extends StatelessWidget implements PreferredS..
간단한 플러터 앱 - 2초마다 한번씩 랜덤한 이름 만들기 플러터를 처음 공부하게 되면 하게 되는 튜토리얼의 앱인 "랜덤 이름 제네레이터" 구글 코드 랩에 나와있는 이 앱을 간단하게 개선해보면서 Stream의 사용법을 익혀봅시다. https://codelabs.developers.google.com/codelabs/first-flutter-app-pt2/#8 이 링크를 통해 "랜덤 이름 제네레이터"를 만들어 보았다는 가정 하에 글을 써보겠습니다. 자 그럼, 우리는 이 앱을 기반으로 기능 하나를 추가해 보도록 합시다. 추가해볼 기능은 바로, 제목에도 나와있듯이, 랜덤한 이름을 2초마다 한번씩 제네레이팅하는 기능입니다. 일단, Dart의 Stream에 대해 알아보기 전에, https://software-creator.tistory.com/13?category=681..
플러터의 위젯 (1) - Container, Child, Children 플러터의 모든 것은, 그 앱 자체를 포함해서, 위젯이다. 이러한 모양의 위젯은, 이러한 트리로 구성된다. Container의 하위로 위젯을 넣으려면 child이나 children에 넣어주면 된다. 이름에서 알수 있듯이, 하나만 넣으려면 child, 여러개면 children이다. A child property if they take a single child – for example, Center or Container A children property if they take a list of widgets – for example, Row, Column, ListView, or Stack. (https://flutter.dev/docs/development/ui/layout 에서 발췌) 여기서 알 수 ..