Skip to content

Instantly share code, notes, and snippets.

Avatar
👾

Aidan McWilliams Aidanvii7

👾
View GitHub Profile
@Aidanvii7
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
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
/**
* 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() {
@get:MainThread
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
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 {
@observable
int counter1 = 0;
@Aidanvii7
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
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) {
@Aidanvii7
Aidanvii7 / google_sign_in.dart
Last active Jul 25, 2019
Flutter Google sign in
View google_sign_in.dart
Future<FirebaseUser> login() async {
final googleUser = await _googleSignIn.signIn();
final googleAuth = await googleUser.authentication;
final authCredential = GoogleAuthProvider.getCredential(
idToken: googleAuth.idToken,
accessToken: googleAuth.accessToken
);
return await _firebaseAuth.signInWithCredential(authCredential);
}