Resolve

Managing dependencies with simple Widgets.

Features:

  • Inversion of control, you define how to instantiate objects from outside
  • Really integrated with the Flutter widget composability approach
  • Scoped resolution since Resolvers and Configurators can be overriden wherever in the tree
  • Generic widgets so you can use the configuration and instances you want

Examples

Quickstart

Provider

class Bootstrapper extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return Provider<String>(
            creator: (context) => "Hello world!",
            child: HomePage());
    }
}

class HomePage extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        final label = Resolver.of<String>(context);
        return Text(label);
    }
}

Resolver

enum Configuration {
  development,
  production,
}

class Bootstrapper extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return Configurator<Configuration>(
            configuration: Configuration.production,
            child: Resolver<String, Configuration>(
            creator: ((context,config) => config == Configuration.development ? "Debug now" : "Online"),
            child: HomePage());
    }
}

class HomePage extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        final label = Resolver.of<String>(context);
        return Text(label);
    }
}

FAQ

Can I use it with the BLoC pattern ?

Absolutely, I created it first for it, but wanted a more generic approach combined with dependency configuration. The solution is just an extended part of a typical bloc provider.

Don't forget to add a disposer for your blocs when registering them into the Resolver to close all exposed streams!

What if I have a pure Dart project ?

You can still use dioc which is a more traditionnal approach to inversion of control.

Libraries

resolve

Dart

dart:ui
Built-in types and core primitives for a Flutter application. [...]

Core

dart:async
Support for asynchronous programming, with classes such as Future and Stream. [...]
dart:collection
Classes and utilities that supplement the collection support in dart:core. [...]
dart:convert
Encoders and decoders for converting between different data representations, including JSON and UTF-8. [...]
dart:core
Built-in types, collections, and other core functionality for every Dart program. [...]
dart:developer
Interact with developer tools such as the debugger and inspector. [...]
dart:math
Mathematical constants and functions, plus a random number generator. [...]
dart:typed_data
Lists that efficiently handle fixed sized data (for example, unsigned 8 byte integers) and SIMD numeric types. [...]

VM

dart:io
File, socket, HTTP, and other I/O support for non-web applications. [...]
dart:isolate
Concurrent programming using isolates: independent workers that are similar to threads but don't share memory, communicating only via messages. [...]