Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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.
/// This should only be used when an initialised [context] is required.
onFirstLoad(Function callback) {
if (isFirstLoad)
setState(() {
_hasLoaded = true;
callback();
});
}
}
/// A mixin which provides common timer functionality and util methods.
mixin StateDelay<T extends StatefulWidget> on State<T> {
List<Timer> _timers = [];
/// Calls the given callback after the given amount of time in milliseconds
delay(int delay, void Function() callback) =>
_timers.add(Timer(Duration(milliseconds: delay), callback));
/// Calls the callback within [setState] after the given amount of time in milliseconds
setStateDelay(int delay, void Function() callback) =>
this.delay(delay, () => setState(callback));
setTimer(Timer timer) => _timers.add(timer);
_cancelTimers() => _timers.forEach((t) => t.cancel());
@override
void dispose() {
_cancelTimers();
super.dispose();
}
}
@bounty1342

This comment has been minimized.

Copy link

@bounty1342 bounty1342 commented Oct 23, 2020

Hi,

Instead of first load, I would use https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html. This would not require a rebuild to access the context.

Safe travel.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment