icapps_architecture 2.1.3
icapps_architecture: ^2.1.3 copied to clipboard
icapps architecture components for flutter projects. Contains commonly used code for logging, extensions, ...
Flutter icapps architecture #
Architecture components used in icapps flutter projects
Custom Error handling #
Localized error
This error can be used to map a localization key/localization to an Exception. So when the exception is thrown you don't have to do an extra mapping to get the correct text.
Network Error
A NetworkError is used simplify the DioErrors. A NetworkError is also a LocalizedError so it is easy to get the correct localization/localizationKey
Extensions #
Context
bool isAndroidTheme
(Returns true if the current theme is targeting the android platform)bool isIOSTheme
(Returns true if the current theme is targeting the ios platform)bool isTablet
(Returns true if the device indicates it is a tablet.)bool isLandscape
(Returns true if the device indicates it is in landscape mode.)
MediaQueryData
bool isTablet
(Returns true if the device indicates it is a tablet.)bool isLandscap
(Returns true if the device indicates it is in landscape mode.)
Iterable
int count(bool Function(T) where)
(Counts all elements for which [where] returns true)E sum<E extends num>(E Function(T) valueProducer)
(Sums the result of [valueProvider] for each item)T? find(bool Function(T) where)
(Finds the first item that matches [where], if no such item could be found)bool all(bool Function(T) where)
(Returnstrue
if every item matches [where])Map<S, T> associateBy<S>(S Function(T) key)
(Create a map by mapping every element using [key]. Duplicate values discarded)Tuple2<List<T>, List<T>> split(bool Function(T) on)
(Splits the elements according to [on]. Items for which [on] is true will be stored in [Tuple2.item1], other items in [Tuple2.item2])Iterable<R> mapIndexed<R>(R Function(int, T) mapper)
(Same as [Iterable.map] except that the [mapper] function also receives the index of the item being mapped)void forEachIndexed(Function(int, T) f)
(Same as [Iterable.foreach] except that the [f] function also receives the index of the item)Iterable<K> mapNotNull<K>(K? Function(T) f)
(Same as [Iterable.map] except that the [f] function can returnnull
and the resulting iterable will not containnull
values)
Iterable<Iterable
List<T> flatten()
(Flattens the list of lists to a single flat list of items)
List
void replaceAll(Iterable<T> newData)
(Replaces all data in the list with [newData])void replaceWhere(bool Function(T) where, T newData, {int? count})
(Replaces all items that matches where with [newData])void sortBy<R>(Comparable<R>? by(T item), {bool ascending = true})
(Sorts the list based on the comparable returned by [by]. By default the sorting is [ascending])void sortBy2<R, V>( Comparable<R>? by(T item), Comparable<V>? by2(T item), {bool ascending = true})
(Sorts the list by comparing first comparing using [by] and if the items are equal, by comparing them using [by2]. By default the sorting is [ascending])
Map<K?,V>
Map<K, V> removeNullKeys()
(Removes all null keys from the map)
Map<K,V?>
Map<K, V> removeNullValues()
(Removes all null values from the map)
T?
R? let<R>(R? Function(T) lambda)
(Execute the given lambda and return a result)
String?
bool isNullOrEmpty
(Will return if the string is null or empty)bool isNotNullOrEmpty
(Will return if the string is not null and not empty)
Interceptor #
CombiningSmartInterceptor
Base class for simple [Dio] interceptors to be used in conjunction with CombiningSmartInterceptor Upon returning an instance of [DioError] from [onRequest] or [onResponse], the error interceptors will NOT be called
ChangeNotifierEx #
Extended version of the foundation's [ChangeNotifier]. Has helper methods to determine if it has been disposed ([disposed]) and convenience methods to register listeners that will be cleaned up when the change notifier is disposed [registerDispose()] and [registerDisposeStream()]
Routes #
FadeInRoute
Page route that fades in the child page
Theme #
BaseThemeData
Holder class for the theme base. Fills in basic shared properties
baseTheme
(Gets the base theme to use to build new themes on)PageTransitionsBuilder getCorrectPageTransitionBuilder(OsInfo info)
(Builds the correct page transition based on the current OS)
Connectivity #
ConnectivityHelper
Helper to determine if a device has connectivity
Future<bool> hasConnection()
(Returns true if the device is connected to an IP network)Stream<bool> monitorConnection()
(Returns a stream that monitors the connectivity state of the device)
Environment global variables #
bool isInTest
(Returns true if the code is currently being execute by unit tests)bool isInRelease
(Returns true if the current code is executing in release mode)bool isInDebug
(Returns true if the current code is executing in debug mode)bool isInProfile
(Returns true if the current code is executing in profile mode)
OsInfo #
int androidSdk
(The android sdk version int (if the app is running native). Eg: 21)double iosVersion
(The ios major and minor version (if the app is running native). Eg: 14.4)bool isWeb
(Indicates that this is a non-native application)bool isAndroid
(Returns true if the app is running natively on android)bool isIOS
(Returns true if the app is running natively on ios)bool isAtLeastAndroid10
(Returns true if the app is running natively on android 10 and higher)bool isAtLeastPie
(Returns true if the app is running natively on android P and higher)bool isIOS13OrAbove
(Returns true if the app is running natively on at least ios 13)Future<void> init
(Initializes the os info)bool isDeviceAndroid
(Platform.isAndroid)bool isDeviceIOS
(Platform.isIOS)
ComputePool #
A pool of isolate workers that will handle passed work. Using a compute pool will greatly reduce the dart isolate startup overhead
ComputePool.createWith({int workersCount = 2})
(Create a new compute pool with the requested number of worker isolates)void shutdown()
(Shuts down the compute pool. Submitting new work will result in an error future being returned)ComputePool.createWith({int workersCount = 2})
(Submit a task to be executed on an isolate in this pool)
FutureHelpers #
Waits for n futures and returns a future containing a [TupleN] with the results for n futures
await2
await3
await4
await5
await6
await7
Logger #
Send logs, via the staticLogger
or logger
Extra configuration can be added using LoggingFactory.configure
You can specific when you you want to actually print something using the Level
void debug(String message, {dynamic error, StackTrace? trace})
void info(String message, {dynamic error, StackTrace? trace})
void warning(String message, {dynamic error, StackTrace? trace})
void error(String message, {dynamic error, StackTrace? trace})
SharedPreferenceStorage #
Utility class to facilitate storing shared preferences
Future<void> saveString({required String key, required String value})
(Saves the given string [value] to the storage with [key])Future<void> saveBoolean({required String key, required bool value})
(Saves the given boolean [value] to the storage with [key])Future<void> saveInt({required String key, required int value})
(Saves the given integer [value] to the storage with [key])Future<void> saveDouble({required String key, required double value})
(Saves the given double [value] to the storage with [key])String? getString(String key)
(Retrieves the stored string value for [key]/ Returns null if the value is not found)bool? getBoolean(String key)
(Retrieves the stored boolean value for [key]. Returns null if the value is not found)int? getInt(String key)
(Retrieves the stored integer value for [key]. Returns null if the value is not found)double? getDouble(String key)
(Retrieves the stored double value for [key]. Returns null if the value is not found)Future<void> deleteKey(String key)
(Deletes the value stored for [key])bool containsKey(String key)
(Returns true if there is a value for [key])Future<void> reload()
(Fetches the latest values from the host platform. Use this method to observe modifications that were made in native code (without using the plugin) or by another process while the app is running.)
Restorable state #
Bundle
Wrapper for storing generic values based on keys. The contained values are all serializable using platform channels
Bundle.from(Object data)
(Creates a bundle from the provided map. The map is assumed to be of type:Map<Object?, Object?>
. See: [asFlatStructure])void putBoolean(String key, bool? value)
(Saves the given value to the map for the given key. If the value is null, the previous mapping is removed (if any))void putInt(String key, int? value)
(Saves the given value to the map for the given key. If the value is null, the previous mapping is removed (if any))void putString(String key, String? value)
(Saves the given value to the map for the given key. If the value is null, the previous mapping is removed (if any))void putBundle(String key, Bundle? bundle)
(Saves the given value to the map for the given key. If the value is null, the previous mapping is removed (if any))void putDouble(String key, double? value)
(Saves the given value to the map for the given key. If the value is null, the previous mapping is removed (if any))void putStringList(String key, List<String>? values)
(Saves the given value to the map for the given key. If the value is null, the previous mapping is removed (if any))void remove(String key)
(Removes the mapping for the given key (if any))bool getBoolean(String key)
(Force-gets the value for the given key, throws if null or wrong type)bool hasKey(String key)
(Checks if the bundle contains a value with the given key)int getInt(String key)
(Force-gets the value for the given key, throws if null or wrong type)String getString(String key)
(Force-gets the value for the given key, throws if null or wrong type)double getDouble(String key)
(Force-gets the value for the given key, throws if null or wrong type)List<String> getStringList(String key)
(Force-gets the value for the given key, throws if null or wrong type)Bundle getBundle(String key)
(Force-gets the value for the given key, throws if null or wrong type)bool? optBoolean(String key)
(Gets the value for the given key, returns null if null or wrong type)int? optInt(String key)
(Gets the value for the given key, returns null if null or wrong type)String? optString(String key)
(Gets the value for the given key, returns null if null or wrong type)double? optDouble(String key)
(Gets the value for the given key, returns null if null or wrong type)Bundle? optBundle(String key)
(Gets the value for the given key, returns null if null or wrong type)List<String>? optStringList(String key)
(Gets the value for the given key, returns null if null or wrong type)Map<Object?, Object?> asFlatStructure() => _internalMap.map((key, value)
(Serializes the bundle to a flat structure that is used by the restoration framework. See [RestorationMixin])
Restorable #
Base class for restorable change view models
void restoreState(Bundle? data)
(Called when the system is restoring or creating a new instance. If the passed bundle is null, it is assumed to be a clean restoration without previous state)void saveState(Bundle target)
(Called when the system needs to prepare data for later restoration. You should save all relevant required data to restore from later. Keep in mind that the system has only a limited amount of space reserved for this data: avoid storing large objects.)
RestorableViewModelHolder
Holder class for restorable view models, use with the flutter restoration Provies you with some helper functions to make sure you can
SimpleKeyValueStorage #
Future<String?> getValue({required String key})
(Get the value associated with the given key. Returns null if the value does not exist.)Future<void> setValue({required String key, required String value})
(Sets the value to be associated with the given key)- `Future
Future<void> removeValue({required String key})
(Removes the value associated with the given key)
AfterLayout #
Added the AfterLayout implementation in our plugin
Provider #
-
BaseProviderWidget
is a widget that can be used to easily generate the viewmodels for your screen. Thecreate
function will be used to create your viewmodelthemeLookup
will be used to get your themelocalizationLookup
will be used to get your localization implementation -
BaseThemeProviderWidget
In some cases you need your theme or localizations you can use this in combination with the right builder function to get just that.
Widgets #
ResponsiveWidget
(Will trigger the correct builder for your screensize)
TouchFeedBack
(Will implement inkwell on Android and a scale animation an iOS)
NativeDialog
Will show a dialog in the devices native style (Material/Cupertino)
LifecycleWidget
is a widget that accepts callback functions that are triggered on various lifecycle events.
Caching #
SingleValueCache<T>
can be used to cache single values
KeyValueCache<T>
can be sed to cache values by key