“The Delegation pattern has proven to be a good alternative to implementation inheritance”. This pattern allows composition to make code just as reusable as inheritance. Kotlin has made delegation a first class language feature through the
by keyword. Kotlin supports delegation in two ways: Interface implementation and property delegation. These delegates will help you reduce boilerplate code, reuse common features and patterns, and recycle existing information into even more usable ways.
When you want to add a small piece of functionality to class in object-oriented programming you would generally start by extending that class. However sometimes this isn’t possible:
While we’re waiting, here is a way to implement multiple receivers now!
During the Kotlin 1.4 Online Event in 2020, Roman Elizarov discussed a potential future feature, Multiple Receivers for extension functions/properties¹. With member extensions you can access the properties and methods of the container class allowing you to have multiple receivers to your extensions. However, if you are not the creator of the class it can appear nearly impossible to make use of multiple receivers. Unfortunately, Roman says in the talk they are a long way from implementing this feature. …
When most people notice or hear that I lost weight, they tell me they gained weight during the pandemic. The next question is, “How are you doing it?”. After they hear my method they always respond with varying levels of seriousness to sarcasm, “No magic pill?”. Nope! Just tried and true calorie deficit, exercise, and working with a mentor/coach.
In March 2020, just before everything shut down, I signed up for my company’s wellness program. This program assigned me a coach that I could meet with weekly to go over my progress, challenges I am facing, and help me make…
On Sept. 2, 2020, the Jetpack team released the
DataStore library to alpha. This library is the replacement to
SharedPreferences and it is awesome!
DataStore comes in two flavors:
Proto DataStore has some additional setup and requires you to define a protocol buffer schema, ensuring type safety.
Preferences DataStore is much easier to setup but doesn’t provide any type safety. This article will explore
First, let’s start by looking at how we create a
val dataStore: DataStore<Preferences> = context.createDataStore( name…
Convert any callback API into a self cleaning Flow.
Kotlin Flows are amazing. Not only do they provide a non-blocking asynchronous way to deal with sequences of values, but they provide a clean and powerful API for dealing with event driven programming. Flows are easy to clean up to prevent leaks. They provide many functions and operators to deal with a myriad of scenarios and requirements. With an experimental function they are super easy to create around callback APIs.
The Jetpack team added
CoroutineScope support to the lifecycle in
2.2.0-alpha01. This allowed callers to launch coroutines in created…
In April 2020, at the start of the global quarantine, Elio Struyf posted an article detailing how to use a Raspberry Pi Zero W and Pimoroni Unicorn pHAT to create a busy light or in meeting indicator for your home office. After some interruptions in work meetings, I decided to build one of these indicators. However during this process I ran into a couple of issues and discovered areas I wanted to improve.
First off Elio’s solution uses a server running on the Raspberry Pi to control the lights and a Homebridge plugin to poll…
A few years ago my team was 3 developers covering 16 apps.We released 4–5 times a month and maintained 4+ star ratings in the Play Store during this busy time. These apps ranged from business style apps, to multimedia apps, to book reader apps. During this same time, we outpaced the much larger iOS team, which comprised eight developers compared to our team of three. …
I remember sitting in the audience at Google I/O 2013 and hearing the announcement that Android Developers had a new IDE built on top of IntelliJ, as well as a new build system based on Gradle. This was the biggest announcement of that entire conference. Up to that point, my team had been using IntelliJ and Maven with the Jayway Maven Android plugin. Our gamble of not following Google with Eclipse and Ant paid off.
Android Studio (Studio) and the Android Gradle Plugin have come a very long way in the past 7 years. Some great features include profilers, device…
I have been developing Android applications since 2012, and at that time the main dependency injection library was RoboGuice. Dagger 1 went 1.0 in May of 2013. Dagger 2’s initial release was in May of 2015. I have had the privilege to use all three libraries and see the change to dependency injection for Android over the years.
RoboGuice was an Android port of Google Guice. It supported more features than just dependency injection, such as layout injection. …
Update: With the release of Hilt, this article is no longer useful as a guide and the library has been deprecated. For more information read my article about Hilt.
Nimrod Dayan wrote a great article on Saving UI state with ViewModel SavedState and Dagger. He goes through and demonstrates how to use Dagger, ViewModels, and Saved State module for ViewModel together with AssistedInject. However, we are left with a large amount of boilerplate by the end.
I have been developing Android Applications professionally since 2012.