Skip to content

Instantly share code, notes, and snippets.

View kangabru's full-sized avatar

Scotty kangabru

View GitHub Profile
@kangabru
kangabru / animation_mixins.dart
Created June 7, 2020 00:51
A couple of handy Flutter mixins I use for animations.
import 'dart:async';
import 'package:flutter/material.dart';
/// A mixin to perform context dependent function when the widget loads.
mixin FirstLoad<T extends StatefulWidget> on State<T> {
bool _hasLoaded = false;
bool get isFirstLoad => !_hasLoaded;
/// Calls the given callback on the first load only.
/// This should NOT be called in [initState] as the UI will not have rendered it.
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:xml/xml.dart';
import 'package:flutter/services.dart';
/// An example widget which uses an [SvgOverride] widget to render an SVG with dynamic colors.
class ZenButtonCookie extends StatelessWidget {
final CookieColor color; // My internal color object. Adapt this for your needs.
const ZenButtonCookie(this.color);
@kangabru
kangabru / animation_widgets.dart
Last active January 2, 2021 12:41
A couple of handy Flutter widgets I use for animations.
import 'package:flutter/material.dart';
import './animation_mixins.dart'; // See my other gist for this
// Ímplicitly animates an int to the given value.
class AnimatedInt extends StatelessWidget {
final int value;
final Duration duration; // milliseconds
final TextStyle style;
AnimatedInt({
@required this.value,
@kangabru
kangabru / screenshot.dart
Last active November 9, 2020 13:27
Allows you extract an image of specific widgets within your app. Includes the ability to ignore certain widgets and to crop the final image.
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
// Note: [ui.Image] represents the lower level image data while [Image] represents a renderable image.
/// Provides the ability to take screenshots of specific widgets.
mixin Screenshot<T extends StatefulWidget> on State<T> {
@kangabru
kangabru / typedFormData.ts
Created August 20, 2020 20:14
Adds expected value types to FormData
// Before: untyped 😥
const form1 = new FormData()
form1.get('url') // Is 'url' expected?
form1.append('image', '?') // Do I pass in a string or blob?
// After: same functionality but with types 😁
const form2 = TypedFormData<{ title: string, image: Blob }>()
@kangabru
kangabru / list_picker.dart
Last active August 17, 2020 08:47
A Flutter scrollable horizontal list widget which animates into place on load.
import 'package:flutter/material.dart';
import './animation_mixins.dart'; // See my other gist for this
/// A scrollable horizontal list which animates into place on load.
class ListPicker extends StatefulWidget {
final List<Widget> children;
final double paddingX, paddingY;
const ListPicker({
this.children,
this.paddingX = 12.0,
@kangabru
kangabru / magnifying_glass.dart
Last active August 17, 2020 08:45
Allows you to display a 'magnifying glass' widget which helps users see what's under their finger while they are drawing
import 'dart:math';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
/// The radius of the mag glass.
const double _RADIUS = 60.0;
/// The distance the mag glass will be offset from the touch point.
const double _OFFSET = _RADIUS * 1.5;