koin 0.14.2 koin: ^0.14.2 copied to clipboard
A pragmatic lightweight dependency injection framework for Dart projects.
Koin.dart #
An pragmatic and flexible lightweight dependency injection library. This is a port of Koin for Dart projects.
Written in pure Dart, using functional resolution only: no code generation, no reflection.
Package | Pub |
---|---|
koin | |
koin_test | |
koin_flutter | |
koin_bloc | |
koin_devtools |
Why should I use Koin? #
-
Allows to dispose your objects at the moment that you are no longer using them.
-
It does not depend on the Flutter.
- The core does not depend on Flutter, so it is possible to use it with any Dart application.
-
Define in which scope a variable can be accessed.
- The koin scope allows you to define in which part of the widget tree a variable will be accessible
-
Integration by default for Bloc library, but it can be easily used with any state management.
-
Koin DevTools to inspect the state of your objects.
- Inspect the internal state of each object at any time on a Flutter page.
-
Dependencies are instances only when needed.
- Its class is instant when used for the first time.
- Koin has a implementation of Lazy by Kotlin to enhance this functionality.
-
It is not invasive.
- Insert Koin in your project without changing the structure of your widgets.
-
Facilitates dependency injection by constructor
- Using dependency injection by constructor you decrease the coupling and make the test easier.
- Makes it easy to know the dependencies of your components. Just look at your class's constructor to identify how dependencies it uses.
Features #
- Modules
- Scopes
- Singleton provider(definition)
- Factory provider(definition)
- Scoped provider(definition)
- Support to multiple bindings
- Support to named provider(definition)
- Easy testing
- Lazy inject
- Logging
- Support to parameter injection
- Integration by default for Bloc library
- DevTools for state inspection
What Koin.dart is not? #
It is not a state manager. Koin does not have any type of state management, use koin with any state manager.
Table Of Contents #
Roadmap #
- Improve documentation
- Add more examples
- Example of use with Redux, Mobx and RxDart.
- Create an external DevTools
- Add logger plugin for logger
Quick Start #
Basic Setup #
Dart #
dependencies:
koin: ^[version]
Flutter #
dependencies:
koin: ^[version]
koin_flutter: ^[version]
Declare a Koin module #
// Given some classes
class Bloc {
final Repository service;
Bloc(this.service);
get state => "Hello";
}
class Repository {}
// just declare your providers(definitions)
final myModule = Module()
// Declare a single provider(definition) for Bloc class
..single((s) => Bloc(s.get()))
// Declare a single provider(definition) for Repository class
..single((s) => Repository());
Starting Koin #
Use the startKoin() function to start Koin in your application.
In a Dart app:
void main(List<String> args) {
startKoin((app){
app.module(myModule);
});
}
In an Flutter app:
void main() {
startKoin((app) {
app.module(homeModule);
});
runApp(MyApp());
}
Injecting dependencies #
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Get a dependency
final bloc = get<Bloc>();
return Container(
child: Text("${bloc.state()}"),
);
}
}
Setup #
Dart #
dependencies:
koin: ^[version]
# Koin for Unit tests
dev_depencies:
koin_test: ^[version]
Flutter #
dependencies:
koin: ^[version]
koin_flutter: ^[version]
# Koin for Unit tests
dev_dependencies:
koin_test: ^[version]
Flutter + Bloc #
dependencies:
koin: ^[version]
koin_flutter: ^[version]
koin_bloc: ^[version]
# Koin for Unit tests
dev_dependencies:
koin_test: ^[version]
Examples #
Basic #
An simple example in Flutter. Code: Repository
Counter #
A more elaborate example using Bloc library as a state management. Code: Repository
Real World #
A application to demonstrate the Koin in a real world application.
Features
- Log in
- Sign up
- Loggout
- Password reset
Code: Repository
DevTools #
Koin DevTools allows you to inspect the internal state of the objects created by the providers(definitions).
Usage #
Just insert the KoinDevTools Widget somewhere in your application or use showDevTools.
class Page extends StatefulWidget {
@override
_PageState createState() => _PageState();
}
class _PageState extends State<Page> {
@override
Widget build(BuildContext context) {
return Scaffold(
/// Just insert the KoinDevTools
endDrawer: KoinDevTools(),
body: IconButton(icon: Text('Shod DevTools'), onPressed: () {
// Or use this
showDevTools(context);
},),
);
}
}
Ask a Question? #
- Post your question on Stackoverflow - #koindart tag
Reporting issues #
Found a bug on a specific feature? Open an issue on Github issues
Contribute #
Want to help or share a proposal about Koin? problem on a specific feature?
- Open an issue to explain the issue you want to solve Open an issue
- After discussion to validate your ideas, you can open a PR or even a draft PR if the contribution is a big one Current PRs
Maintainers #
Credits #
- Arnaud Giuliani and all contributors to the original Koin version written in Kotlin.
Dependencies #
- Kt.dart port by Pascal Welsch