Skip to content

Instantly share code, notes, and snippets.


Aidan McWilliams Aidanvii7

View GitHub Profile
Aidanvii7 / SparseArrayExtensions.kt
Last active Dec 17, 2019
A collection of extension functions for Android's SparseArray
View SparseArrayExtensions.kt
package com.aidanvii.extensions
import android.util.SparseArray
import java.util.*
val SparseArray<*>.max: Int get () = size() - 1;
inline fun <V> SparseArray<V>.forEachValue(action: (V) -> Unit): SparseArray<V> {
for (index in 0..max) {
val key = keyAt(index)
Aidanvii7 / Logger.kt
Last active Feb 25, 2017
Simple Log delegation in Kotlin with extension function.
View Logger.kt
package com.aidanvii.extensions
fun Any.logD(message: String) = Logger.d(javaClass.simpleName, message)
interface LoggerDelegate {
fun d(tag: String, message: String)
interface CompositeLoggerDelegate : LoggerDelegate {
fun attachDelegate(delegate: LoggerDelegate)
View UserViewModel.kt
package com.aidanvii7.mvvm
class UserViewModel(val firstName: String, val lastName: String)
View BindableProperty.kt
fun <T> BaseObservable.bindable(initialValue: T, propertyId: Int): BindableProperty<T> {
return BindableProperty<T>(initialValue, this)
class BindableProperty<T>(initialValue: T,
private val observable: BaseObservable) : ObservableProperty<T>(initialValue) {
private var propertyId: Int = 0
override fun beforeChange(property: KProperty<*>, oldValue: T, newValue: T): Boolean {
View ViewModelFactory.kt
import android.arch.lifecycle.ViewModel
import android.arch.lifecycle.ViewModelProvider
import android.arch.lifecycle.ViewModelProviders
* Implementation of [ViewModelProvider.Factory] that takes care of the slightly awkward generic method [ViewModelProvider.Factory.create]
* It removes the need for the client to manually handle the given ViewModel [Class] in an if else clause or switch statement, or perform type casting when returning.
View MyViewModel.kt
class MyViewModel : ViewModel() {
val users: LiveData<List<String>> by unsafeLazy {
MutableLiveData<List<String>>().apply { loadUsersInto(this) }
private fun loadUsersInto(liveData: MutableLiveData<List<String>>) {
// do async operation to fetch users and update
View DataBindingTrackingExample.kt
inline fun <V : View, I> V.trackInstance(
newInstance: I?,
@IdRes instanceResId: Int,
onDetached: V.(I) -> Unit = {},
onAttached: V.(I) -> Unit = {}
) {
ListenerUtil.trackListener(this, newInstance, instanceResId).let { oldInstance ->
if (oldInstance !== newInstance) { // referential comparison
oldInstance?.let { onDetached(oldInstance) }
newInstance?.let { onAttached(newInstance) }
Aidanvii7 / counter_store.dart
Created Jul 7, 2019
Example of using MobX Dart with Flutter's Counter example, plus some extras
View counter_store.dart
import 'package:mobx/mobx.dart';
part 'counter_store.g.dart';
class CounterStore = _CounterStore with _$CounterStore;
abstract class _CounterStore with Store {
int counter1 = 0;
Aidanvii7 / consumer_observer.dart
Last active Jul 9, 2019
A convenience widget for providing instances of Store, with automatic disposal
View consumer_observer.dart
import 'package:flutter/widgets.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:provider/provider.dart';
typedef ConsumerObserverBuilder<T> = Widget Function(BuildContext context, T value);
class ConsumerObserver<T> extends StatelessWidget {
final ConsumerObserverBuilder<T> builder;
final Widget prebuiltChild;
Aidanvii7 / transient.dart
Created Jul 9, 2019
Simple wrapper class for consuming one time events from a MobX store
View transient.dart
class Transient<T> {
T _value;
Transient(T value) {
this._value = value;
void use(Function(T value) block) {
assert(block != null);
if (_value != null) {