injectable

3.0.0

Injectable is a convenient code generator for get_it. Inspired by Angular DI, Guice DI and inject.dart.

Download archive

Readme


Installation

dependencies:
  # add injectable to your dependencies  
  injectable:
  # add get_it  
  get_it:

dev_dependencies:
  # add the generator to your dev_dependencies  
  injectable_generator:
  # add build runner if not already added  
  build_runner:  

LeanBuilder support (Experimental) ⚡

injectable_generator (2.12.0+) now supports LeanBuilder for super-fast incremental builds.

To use lean_builder instead of build_runner, simply add it to your dev_dependencies:

dev_dependencies:
  injectable_generator: <latest-version>
  lean_builder: <latest-version>

and then run the builder using:

For one-time build:

dart run lean_builder build

For watching files and rebuilding on changes:

dart run lean_builder watch

To disable injectable_generator from using build_runner, you can add the following to your build.yaml file:

targets:
  $default:
    builders:
      injectable_generator:injectable_builder:
        enabled: false
      injectable_generator:injectable_config_builder:
        enabled: false

Setup


  1. Create a new dart file and define a global var for your GetIt instance.
  2. Define a top-level function (lets call it configureDependencies) then annotate it with @injectableInit.
  3. Import the Generated dart file created later on in the code. This will follow the name of the file with the @InjectableInit annotated func, eg file_name.config.dart.
  4. Call the Generated extension func getIt.init(), or your custom initializer name inside your configure func.

Note: This example is for version 2+

import '<FILE_NAME>.config.dart';
	
final getIt = GetIt.instance;  
  
@InjectableInit(  
  initializerName: 'init', // default  
  preferRelativeImports: true, // default  
  asExtension: true, // default  
)  
void configureDependencies() => getIt.init();  

Note: you can tell injectable what directories to generate for using the generateForDir property inside of @injectableInit.
The following example will only process files inside of the test folder.

import '<FILE_NAME>.config.dart';
	
@InjectableInit(generateForDir: ['test'])  
void configureDependencies() => getIt.init();  
  1. Call configureDependencies() in your main func before running the App.
void main() {  
 configureDependencies();  
 runApp(MyApp());  
}  

Registering factories


All you have to do now is annotate your injectable classes with @injectable and let the generator do the work.

@injectable  
class ServiceA {}  
  
@injectable  
class ServiceB {  
    ServiceB(ServiceA serviceA);  
}  
  

Cached Factories

To register cached factories pass true to the cache property inside of the @Injectable annotation.


@Injectable(cache: true)
class ServiceA {}
  

to read more about cached factories check the GetIt docs

Run the generator

Use the [watch] flag to watch the files' system for edits and rebuild as necessary.

flutter packages pub run build_runner watch  

if you want the generator to run one time and exits use

flutter packages pub run build_runner build  

Inside of the generated file

Injectable will generate the needed register functions for you.

import 'package:get_it/get_it.dart' as _i1;

extension GetItInjectableX on _i1.GetIt {
  /// initializes the registration of main-scope dependencies inside of [GetIt]  
  Future<_i1.GetIt> init({
    String? environment,
    _i2.EnvironmentFilter? environmentFilter,
  }) async {
    final gh = _i2.GetItHelper(
      this,
      environment,
      environmentFilter,
    );
    gh.factory<ServiceA>(() => ServiceA());
    gh.factory<ServiceB>(ServiceA(getIt<ServiceA>()));
    return this;
  }
}  

Registering singletons


Use @singleton or @lazySingleton to annotate your singleton classes. Alternatively use the constructor version to pass signalsReady to getIt.registerSingleton(signalsReady) @Singleton(signalsReady: true) >> getIt.registerSingleton(Model(), signalsReady: true) @LazySingleton() >> getIt.registerLazySingleton(() => Model())

@singleton // or @lazySingleton  
class ApiProvider {}  

Disposing of singletons

GetIt provides a way to dispose singleton and lazySingleton instances by passing a dispose callback to the register function. Injectable works in the static realm, which means it's not possible to pass instance functions to your annotation; luckily injectable provides two simple ways to handle instance disposal.

1- Annotating an instance method inside of your singleton class with @disposeMethod.

@singleton // or lazySingleton  
class DataSource {

  @disposeMethod
  void dispose(){
    // logic to dispose instance  
  }
}  

2- Passing a reference to a dispose function to Singleton() or LazySingleton() annotations.

@Singleton(dispose: disposeDataSource)
class DataSource {

  void dispose() {
    // logic to dispose instance  
  }
}
/// dispose function signature must match Function(T instance)  
FutureOr disposeDataSource(DataSource instance){
  instance.dispose();
}  

FactoryMethod and PostConstruct Annotations

As the name suggests @FactoryMethod annotation is used to tell injectable which method to use to create the dependency, and that includes named constructors, factory constructs and static create methods.

@injectable
class MyRepository {
  @factoryMethod
  MyRepository.from(Service s);
}  

The constructor named "from" will be used when building MyRepository.

factory<MyRepository>(MyRepository.from(getIt<Service>()))  

or annotate static create functions or factories inside of abstract classes with @factoryMethod.

@injectable
abstract class Service {
  @factoryMethod
  static ServiceImpl2 create(ApiClient client) => ServiceImpl2(client);

  @factoryMethod
  factory Service.from() => ServiceImpl();
}  

on the other hand @PostConstruct annotation is used to initialize the constructed dependency synchronously or asynchronously and that only includes public member methods.

@Injectable()
class SomeController  {
  SomeController(Service service);

  @PostConstruct()
  void init() {
    //...init code  
  }

}  

now both of these annotations take an optional bool flag preResolve. If the create or initialize methods return a future and preResolve is true, the future will be pre-resolved ( awaited ) before the dependency is registered inside of GetIt, otherwise it's registered as an async dependency.

Registering asynchronous injectables

Requires GetIt >= 4.0.0 if we are to make our instance creation async we're gonna need a static initializer method since constructors can not be asynchronous.

class ApiClient {
  static Future<ApiClient> create(Deps ...) async {
  ....
  return apiClient;
  }
}  

Now simply annotate your class with @injectable and tell injectable to use that static initializer method as a factory method using the @factoryMethod annotation

@injectable // or lazy/singleton  
class ApiClient {
  @factoryMethod
  static Future<ApiClient> create(Deps ...) async {
  ....
  return apiClient;
  }
}  

injectable will automatically register it as an asynchronous factory because the return type is a Future.

Generated Code:

factoryAsync<ApiClient>(() => ApiClient.create());  

Using a register module (for third party dependencies)

just wrap your instance with a future, and you're good to go.

@module
abstract class RegisterModule {
  Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}  

Don't forget to call getAsync<T>() instead of get<T>() when resolving an async injectable.

Pre-Resolving futures

if you want to pre-await the future and register its resolved value, annotate your async dependencies with @preResolve.

@module
abstract class RegisterModule {
  @preResolve
  Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}  

It also works with @factoryMethod and @postConstruct annotations.

@Injectable()
class AsyncService  {
  AsyncService(Service service);

  // @preResolve -> this works as well  
  @FactoryMethod(preResolve: true)
  static Future<AsyncService> create(@factoryParam String? param) =>
      Future.value(AsyncService(Service.from(param));
      }  
@Injectable()
class SomeController  {
  SomeController(Service service);

  // @preResolve -> this works as well  
  @PostConstruct(preResolve: true)
  Future<AsyncService> init(@factoryParam String? param) =>
      Future.value(SomeController(Service.from(param));
      }  

Generated Code:

import 'package:get_it/get_it.dart' as _i1;

extension GetItInjectableX on _i1.GetIt {
  /// initializes the registration of main-scope dependencies inside of [GetIt]  
  Future<_i1.GetIt> init({
    String? environment,
    _i2.EnvironmentFilter? environmentFilter,
  }) async {
    final gh = _i2.GetItHelper(
      this,
      environment,
      environmentFilter,
    );
    final registerModule = _$RegisterModule();
    final sharedPreferences = await registerModule.prefs;
    gh.factory<SharedPreferences>(() => sharedPreferences);
    return this;
  }
}  

as you can see this will make your init func async so be sure to await for it.

Passing Parameters to factories


Requires GetIt >= 4.0.0

If you're working with a class you own simply annotate your changing constructor param with @factoryParam, you can have up to two parameters max!

@injectable
class BackendService {
  BackendService(@factoryParam String url);
}  

Generated Code:

factoryParam<BackendService, String, dynamic>(
(url, _) => BackendService(url),
);  

Using a register module (for third party dependencies)

if you declare a module member as a method instead of a simple accessor, injectable will treat it as a factory method, meaning it will inject its parameters as it would with a regular constructor.

This is similar to how if you annotate an injected param with @factoryParam injectable will treat it as a factory param.

@module
abstract class RegisterModule {
  BackendService getService(ApiClient client, @factoryParam String url) => BackendService(client, url);
}  

Generated Code:

factoryParam<BackendService, String, dynamic>(
(url, _) => registerModule.getService(g<ApiClient>(), url));  

Binding abstract classes to implementations

--- Use the 'as' Property inside of Injectable(as:..) to pass an abstract type that's implemented by the registered dependency

@Injectable(as: Service)
class ServiceImpl implements Service {}

// or  
@Singleton(as: Service)
class ServiceImpl implements Service {}

// or  
@LazySingleton(as: Service)
class ServiceImpl implements Service {}

Generated Code:
factory<Service>(() => ServiceImpl())  

Binding an abstract class to multiple implementations

Since we can't use type binding to register more than one implementation, we have to use names (tags) to register our instances or register under different environment. (we will get to that later)

@Named("impl1")
@Injectable(as: Service)
class ServiceImpl implements Service {}

@Named("impl2")
@Injectable(as: Service)
class ServiceImp2 implements Service {}  

Next annotate the injected instance with @Named() right in the constructor and pass in the name of the desired implementation.

@injectable
class MyRepo {
  final Service service;
  MyRepo(@Named('impl1') this.service)
}  
Generated Code:
factory<Service>(() => ServiceImpl1(), instanceName: 'impl1')
factory<Service>(() => ServiceImpl2(), instanceName: 'impl2')

factory<MyRepo>(() => MyRepo(getIt('impl1'))  

Auto Tagging

Use the lower cased @named annotation to automatically assign the implementation class name to the instance name. Then use @Named.from(Type) annotation to extract the name from the type.

@named
@Injectable(as: Service)
class ServiceImpl1 implements Service {}

@injectable
class MyRepo {
  final Service service;
  MyRepo(@Named.from(ServiceImpl1) this.service)
}  
Generated Code:
factory<Service>(() => ServiceImpl1(), instanceName: 'ServiceImpl1')
factory<MyRepo>(() => MyRepo(getIt('ServiceImpl1'))  

Register under different environments


it is possible to register different dependencies for different environments by using @Environment('name') annotation. in the below example ServiceA is now only registered if we pass the environment name to $init(environment: 'dev').

@Environment("dev")
@injectable
class ServiceA {}  

you could also create your own environment annotations by assigning the const constructor Environment("") to a global const var.

const dev = Environment('dev');
// then just use it to annotate your classes  
@dev
@injectable
class ServiceA {}  

You can assign multiple environment names to the same class.

@test
@dev
@injectable
class ServiceA {}  

Alternatively use the env property in injectable and subs to assign environment names to your dependencies.

@Injectable(as: Service, env: [Environment.dev, Environment.test])
class RealServiceImpl implements Service {}  

Now passing your environment to init function will create a simple environment filter that will only validate dependencies that have no environments or one of their environments matches the given environment.
Alternatively, you can pass your own EnvironmentFilter to decide what dependencies to register based on their environment keys, or use one of the shipped ones:

  • NoEnvOrContainsAll
  • NoEnvOrContainsAny
  • SimpleEnvironmentFilter

Registering third party types


To Register third party types, create an abstract class and annotate it with @module then add your third party types as property accessors or methods as follows:

@module
abstract class RegisterModule {
  @singleton
  ThirdPartyType get thirdPartyType;

  @prod
  @Injectable(as: ThirdPartyAbstract)
  ThirdPartyImpl get thirdPartyType;
}  

Providing custom initializers

In some cases you'd need to register instances that are asynchronous or singleton instances or just have a custom initializer and that's a bit hard for injectable to figure out on its own, so you need to tell injectable how to initialize them:

@module
abstract class RegisterModule {
  // You can register named preemptive types like follows  
  @Named("BaseUrl")
  String get baseUrl => 'My base url';

  // url here will be injected  
  @lazySingleton
  Dio dio(@Named('BaseUrl') String url) => Dio(BaseOptions(baseUrl: url));

  // same thing works for instances that's gotten asynchronous.  
  // all you need to do is wrap your instance with a future and tell injectable how  
  // to initialize it  
  @preResolve // if you need to pre resolve the value  
  Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
// Also, make sure you await for your configure function before running the App.  
}  

if you're facing even a weirder scenario you can always register them manually in the configure function.

Auto registering


Instead of annotating every single injectable class you write, it is possible to use a Convention Based Configuration to auto register your injectable classes, especially if you follow a concise naming convention.

For example, you can tell the generator to auto-register any class that ends with Service, Repository or Bloc
using a simple regex pattern
class_name_pattern: 'Service$|Repository$|Bloc$'
To use auto-register create a file with the name build.yaml in the same directory as pubspec.yaml and add

targets:
  $default:
    builders:
      injectable_generator:injectable_builder:
        options:
          auto_register: true
          # auto registers any class with a name matches the given pattern  
          class_name_pattern:
            "Service$|Repository$|Bloc$"
          # auto registers any class inside a file with a  
          # name matches the given pattern  
          file_name_pattern: "_service$|_repository$|_bloc$"  

Manual order

By default injectable tries to re-order dependencies based on their dependents, meaning if A depends on B, B will be registered first.

You can manually decide the order of a specific dependency by giving it a negative number to register it before everything else or a positive number to register it after everything else.

Note All dependencies have order of 0 by default.
You specify the custom order by using annotation @Order(number) or using the property order inside of injectable and subs

// @Order(-1) this works too  
@Injectable(order: -1)
class Service{}  

Using Scopes

GetIt v5.0 introduced scopes support, which allows registration of related dependencies in a different scope, so they can be initialized only when needed and disposed of when they're not. More on that here.

To use GetIt scopes using injectable you simply annotate the dependencies that are meant to be registered in a different scope with @Scope('scope-name') or pass in the scope name to Injectable or its subs like so @Injectable(scope: 'scope-name').

dependencies tagged with a scope name will be generated inside of a separate init method than the other main-scope dependencies.
e.g.

// @Scope('auth') this works too  
@Injectable(scope: 'auth')
class AuthController{}  

when you're ready to use the auth-scope, call the generated scope-init method or extension.

 // using extensions  
getIt.initAuthScope();
// using methods  
initAuthScope(getIt);

// scope-init method will return future if it has pre-resolved dependencies  
// so make sure you await it  
await getIt.initAuthScope();

Including microPackages and external modules

MicroPackages are sub packages that can be depended on and used by the root package, packages that's annotated as micro will generate a MicroPackageModule instead of an init-method and the initiation of those modules is done automatically by the root package's init-method.
so all you have to do is annotate the package as a microPackage by using the named constructor @InjectableInit.microPackage()

// @microPackageInit => short const  
@InjectableInit.microPackage()
initMicroPackage(){} // will not be called but needed for code generation  

Generated Code:

class AwesomePackageModule extends MicroPackageModule {
  @override
  FutureOr<void> init(_i1.GetItHelper gh) {
    gh.factory<Dep>(() => Dep());
    gh.factory<Calculator>(() => Calculator(gh<Dep>()));
  }}

To include micro packages, use the externalPackageModulesBefore and externalPackageModulesAfter properties of @InjectableInit:

@InjectableInit(
  externalPackageModulesBefore: [
    ExternalModule(AwesomePackageModule),
  ],
)
void configureDependencies() {}

Note: Modules assigned to externalPackageModulesBefore will be initialized before the root dependencies; Modules assigned to externalPackageModulesAfter will be initialized after the root dependencies;

Initializing modules inside of scopes

External Modules can be initialized inside of specific scopes by simply assigning a scope to ExternalModule.

@InjectableInit(
  externalPackageModulesBefore: [
    ExternalModule(AwesomePackageModule, scope: 'awesome'),
  ], )
void configureDependencies() {}

then a scope initialization method/extension will be generated.

 await getIt.initAwesomeScope()

Problems with the generation?

Make sure you always Save your files before running the generator, if that does not work you can always try to clean and rebuild.

flutter packages pub run build_runner clean  

Support the Library

  • You can support the library by staring it on Github && liking it on pub or report any bugs you encounter.
  • also, if you have a suggestion or think something can be implemented in a better way, open an issue and let's talk about it.
Changelog

ChangeLog

[3.0.0]

  • Breaking: Removed includeMicroPackages option. Micro packages must now be explicitly registered using externalPackageModulesBefore and externalPackageModulesAfter in @InjectableInit.
  • Breaking: Removed deprecated usesNullSafety option. Null safety is now always assumed.
  • Feat: Add support for multiple registrations via allowMultipleRegistrations (#535, #531).
  • Fix: Treat external dependencies as non-blocking in environment sorting (#539, Fixes #532).

[2.7.1+4]

  • Docs: fix a typo in readme

[2.7.1+3]

  • Docs: update docs to include lean_builder support

[2.7.1+2]

  • Fix: fix coverage badge alignment in readme

[2.7.1+1]

  • Chore: add test coverage badge to readme

[2.7.1]

  • Feat: Add generateAccessors option to @InjectableInit annotation for generating GetIt extension getters
  • Feat: Improve dependency sorting logic
  • Feat: Add test coverage reporting
  • Feat: Add comprehensive test suite for better code quality

[2.7.0]

  • Feat: Add support to cached factories introduced in get_it 8.0.0
  • Chore: update get_it constraint to 8.3.0 <= 10.0.0

[2.6.0]

  • Chore: update get_it constraint to 7.2.0 < 10.0.0

[2.5.2]

  • Update dart constrains to ">=3.8.0 <4.0.0"

[2.5.1]

  • Feat: handle and pass on exception for async scope initialization
  • Feat: Add generateForEnvironments option
  • Fix: Add missing dispose param to getIt.registerSingleton when preResolve is true

[2.5.0]

  • Chore: update get_it constraint to 7.2.0 <= 9.0.0
  • Fix: scope annotation does not work with getters

[2.4.4]

  • Fix: Fix dispose not passed to getIt.registerSingleton

[2.4.3]

  • Feat: Improve Code Generation consistency using hash in alias imports
  • Fix: Fix @preResolve only works for methods warning

[2.4.2]

chore: unpin meta version

[2.4.1]

Revert: Pin meta version to 1.11.0 so it's compatible with flutter_test

[2.4.0]

Feat: add @ignoreParam annotation to ignore optional parameters in factory methods

[2.3.5]

Fix: add generic type annotation to registerSingleton() call #436

[2.3.4]

  • HotFix for Postpone singleton initialisation to respect environment filters

[2.3.3] (skip)

  • Fix Postpone singleton initialisation to respect environment filters by @lrampazzo

[2.3.2]

  • Add option to pass instance callback function to the init function by @Adam-Langley

[2.3.1]

  • Fix PreResolved singletons/factories fail checking environment filters #398

[2.3.0]

  • Added [rootDir] support for specifying the root directory for the generation process.
  • Fix Undefined name 'gh'. when generating @InjectableInit() with only microPackageModule #392

[2.2.0]

  • Optimize injectable_generator async analysis by [https://github.com/Jjagg]
  • Update dart constrains to ">=3.0.0 <4.0.0"
  • Update analyzer constrains to include v6+

[2.1.2]

  • Update dart constrains to ">=2.17.0 <4.0.0"

[2.1.1]

  • add coverage:ignore-file comment to generated config
  • fix relative imports not working

[2.1.0]

  • Add support for micro package modules order [before,after]
  • Add support for micro package modules scopes

[2.0.1]

  • Fix registration order #324
  • Fix some types in readme file

[2.0.0] [Minor breaking changes]

  • Add support for micro packages
  • Add support for external package modules
  • Add support for manual dependencies ordering thanks to @casvanluijtelaar
  • Add support for GetIt scopes
  • Add @PostConstruct annotation to execute sync/async code after construction
  • Add preResolve to @FactoryMethod annotation
  • Add throwOnMissingDependencies flag to @InjectableInit annotation
  • Change asExtension default value to true [breaking change]
  • Change initializerName default value to 'init' [breaking change]

[1.5.3]

  • Sync injectable and injectable_generator with GetIt v7.2.0 to generate non-nullable @factoryParams
  • Migrate to analyzer 3.0.0

[1.5.0]

Use getAsync for async injected dependencies, fixes #230 Add support for function factory params, fixes #224 Update analyzer version #228 Add ignore types in packages support Fix some readme typos

[1.4.1]

  • Pomp up build_runner version to 2.0.3
  • Fix generator crash when using inline environments #205

[1.4.0]

  • Pomp up get_it version to range to 7.0.0 <= 8.0.0
  • Pomp up build_runner version to 2.0.2

[1.3.0]

  • Include merge that fixes #194
  • Pomp up versions of build_runner -> 2.0.1, code_builder -> 4.0.0, analyzer -> 1.5.0

[1.2.2]

  • Fix generator crash after 1.2.1 update
  • Add option to ignore missing type warning for specified types

[1.2.1]

  • Pomp up versions of build, build_runner, dart_style and source_gen
  • Fix named instances are ignored when sorting dependencies.
  • Clean up some code

[1.2.0]

  • Push nullSafety version to the main section
  • Fix sorting by dependents ignores named instances

[1.2.0-nullsafety]

  • add null safety support

[1.1.2]

  • Add support for disposing of singletons.
  • change min version constraint of GetIt to 5.0.0
  • update readme file

[1.1.0]

  • Refactor code to support null-safety
  • Fix preResolved instances conditional registration
  • Add option to generate null-safety compatible code to injectableInit

[1.0.7]

  • Fix pre-resolved primitives naming issue #161
  • Fix some types in readme file
  • Fix environments is already registered issue.

[1.0.5]

  • Add support for get_it ^5.0
  • Fix analyzer compatibility issues

[1.0.4]

  • Add option to customize the initializer function name
  • Add option to generate the initializer function as an extension
  • Change initializer functions returns the passed get_it instance instead of void
  • Add Advanced environment filter that can be extended and customized
  • Fix Injectable generator not handling multiple instances of generic types #107

[1.0.2]

  • Add option to not prefer relative imports in @InjectableInit

[1.0.0+1]

  • Fix some analysis warnings for pub points

[1.0.0] Breaking Change

  • Add support for multi environments (annotation & inlined)
  • Add generation-time check for duplicate dependencies under the same environment
  • Fix 3rd party imports from src instead of library file issue
  • Change generated file extension to .config.dart
  • Change generated file applies to most of effective dart rules including preferring relative imports
  • Clean up some code

[0.4.0+1]

  • Update README file
  • Add some comments

[0.4.0] Breaking Changes!

  • Change Methods inside of register modules are treated as factory methods now, so all params are considered injected params unless annotated with @factoryParam.
  • Change registerModule is now replaced with @module
  • Change RegisterAs(Type) Annotation is now replaced with @Injectable(as:Type)
  • Change Singleton.Lazy() is replaced with @LazySingleton()
  • Add generateForDir property to @InjectableInt to specify what directories to generate for.
  • Fix imports issue when working with bin directory

[0.3.0] Breaking Changes!

  • add support for GetIt 4.0.0
  • fix generic types are registered as dynamic
  • fix unresolved future when registering asynchronous dependencies
  • change asynchronous dependencies will be registered using async factory unless annotated with @preResolve

[0.2.3]

  • improve support for custom initializers
  • fix src import issue

[0.2.2]

  • remove flutter dependency
  • add support for custom initializers in register Modules
  • minor fixes

[0.2.1]

  • fix typo in @Environment annotation

[0.2.0] Breaking Changes!

  • You now need to pass in your getIt instance to @initGetIt() func
  • Rename @Bind to @RegisterAs to avoid confusion because, now we're annotating the implementation not the abstract.
  • Add @factoryMethod annotation to mark named factories and static create methods.
  • Add @registerModule annotation to support registering third party types.
  • Fix eager singletons are registered before their dependencies.

[0.1.0]

  • initial release

Installing

export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add injectable
pubspec.yaml
name: injectable
description: Injectable is a convenient code generator for get_it. Inspired by Angular DI, Guice DI and inject.dart.
version: 3.0.0
homepage: https://github.com/Milad-Akarie/injectable

environment:
  sdk: ">=3.8.0 <4.0.0"

dependencies:
  get_it: ">=8.3.0 <10.0.0"
  meta: ^1.16.0

dev_dependencies:
  lints: ^6.0.0
  test: ^1.28.0
  coverage: ^1.15.0

Version history

VersionPublishedArchiveSHA-256
0.1.0On demandDownload0d1fecd8…e52af4
0.2.0On demandDownload592f2bdb…1e0192
0.2.1On demandDownload2c888b71…c8d5ef
0.2.2On demandDownloadace71897…e17f99
0.2.3On demandDownloadf59819a6…5bee6d
0.3.0On demandDownload218d83d7…d65b7e
0.4.0On demandDownloaddc4a0925…e57aa3
0.4.0+1On demandDownload0fde8984…a2a9fe
1.0.0On demandDownloade061c912…855da2
1.0.0+1On demandDownload384f9fd9…b30a5e
1.0.2On demandDownload0c721bec…8e4443
1.0.4On demandDownload2ae0e2a6…af41ce
1.0.5On demandDownload4de033e3…fd62fd
1.0.7On demandDownloadb4c630d4…f362ce
1.1.0On demandDownload231b00c9…c1de99
1.1.2On demandDownloadf07bbe5f…d519cf
1.2.0-nullsafetyOn demandDownloadcef1dfd7…2f94e1
1.2.0On demandDownloade4dc2348…9f6eb2
1.2.1On demandDownload56daf09c…018323
1.2.2On demandDownload836ee9c0…d6d27e
1.3.0On demandDownload8942debb…fbb423
1.4.0On demandDownloadf6ebe057…a98a5a
1.4.1On demandDownloadde116c7b…02f5ed
1.5.0On demandDownload1dbd23da…346f0a
1.5.3On demandDownload61976e14…e8da01
1.5.4On demandDownloadf71eb879…06443a
2.0.0On demandDownload55d71757…5f7e4e
2.0.1On demandDownload6b9f74d2…51960d
2.1.0On demandDownload7dab7d34…916f7b
2.1.1On demandDownloadc0cc829e…e64d0c
2.1.2On demandDownloadfbe4b673…81ed1b
2.2.0On demandDownload4cc54247…192ee9
2.3.0On demandDownload5217c45f…f7883f
2.3.1On demandDownload6c67a3e4…91d8ce
2.3.2On demandDownloadcd3c422e…d0bbeb
2.3.3On demandDownloadbd91492a…66fa75
2.3.4On demandDownloadbbaddc57…bf013d
2.3.5On demandDownload44b4aa25…bb75a7
2.4.0On demandDownloadfb722c86…63c9c6
2.4.1On demandDownload3d989672…c20041
2.4.2On demandDownload3c8355a2…f51226
2.4.3On demandDownloadc4de6dd4…70aba2
2.4.4On demandDownload69874ba3…585198
2.5.0On demandDownload5e1556ea…006068
2.5.1On demandDownload1b86fab6…1141c1
2.5.2On demandDownloadf71ef28f…917534
2.6.0On demandDownload29559f7e…82697d
2.7.0On demandDownload32e9bac6…a7559c
2.7.1On demandDownloadc5dfd2a1…ae44be
2.7.1+1On demandDownload2a9a01c5…6c09a9
2.7.1+2On demandDownload8fc24421…b8f3fe
2.7.1+3On demandDownloadb4fb939e…393150
2.7.1+4On demandDownload32b36a9d…bf598c
3.0.0Cached · Upstream SHA-256 matchedDownload1da63995…2e379e

Dependencies

get_it "\u003e=8.3.0 \u003c10.0.0"

meta "^1.16.0"