Flutter Data

tests codecov pub.dev license

Flutter Data is the seamless way to work with persistent data models in Flutter.

Inspired by Ember Data and ActiveRecord.

Features

  • Auto-generated repositories (REST clients) for all models 🚀
    • CRUD and custom actions on remote API
    • StateNotifier, Future and Stream APIs
  • Built for offline-first 🔌
    • uses Hive at its core for caching & local storage
    • included read/write retry offline adapter
  • Effortless setup
    • Automatically pre-configured for provider, riverpod and get_it
    • Convention over configuration powered by Dart mixins
  • Exceptional relationship support ⚡️
    • Automatically synchronized, traversable relationship graph
    • Reactive relationships
  • Clean, intuitive API and minimal boilerplate 💙
    • Truly configurable and composable
    • Scales very well (both up and down)

Check out the Documentation or the Tutorial 📚 where we build a CRUD app from the ground app in record time.

Getting started

See the quickstart guide in the docs.

👩🏾‍💻 Usage

For a given User model annotated with @DataRepository...

@JsonSerializable()
@DataRepository([MyJSONServerAdapter])
class User with DataModel<User> {
  @override
  final int id;
  final String name;
  User({this.id, this.name});
}

mixin MyJSONServerAdapter on RemoteAdapter<User> {
  @override
  String get baseUrl => "https://my-json-server.typicode.com/flutterdata/demo/";
}
  • id can be of int, String, etc
  • User.fromJson and toJson are not required!

After a code-gen build, Flutter Data will generate a Repository<User>:

// obtain it via Provider
final repository = context.watch<Repository<User>>();

return DataStateBuilder<List<User>>(
  notifier: () => repository.watchAll();
  builder: (context, state, notifier, _) {
    if (state.isLoading) {
      return CircularProgressIndicator();
    }
    // state.model is a list of 10 user items
    return ListView.builder(
      itemBuilder: (context, i) {
        return UserTile(state.model[i]);
      },
    );
  }
}

repository.watchAll() will make an HTTP request (to https://my-json-server.typicode.com/flutterdata/demo/users in this case), parse the incoming JSON and listen for any further changes to the User collection – whether those are local or remote!

state is of type DataState which has loading/error/data substates. Moreover, notifier.reload() is available, useful for the classic "pull-to-refresh" scenario.

In addition to the reactivity, a User now gets extensions and automatic relationships, ActiveRecord-style:

final todo = await Todo(title: 'Finish docs').init(context).save();
// POST https://my-json-server.typicode.com/flutterdata/demo/todos/
print(todo.id); // 201

final user = await repository.findOne(1, params: { '_embed': 'todos' });
// GET https://my-json-server.typicode.com/flutterdata/demo/users/1?_embed=todos
print(user.todos.length); // 20

await user.todos.last.delete();

For an in-depth example check out the Tutorial.

Fully functional app built with Flutter Data? See the code for the finished Flutter Data TO-DOs Sample App.

Compatibility

Fully compatible with the tools we know and love:

             
Flutter  ✅It can also be used with pure Dart
json_serializable  ✅Not required! Other fromJson/toJson can be supplied
JSON REST API  ✅Great support
JSON:API  ✅Great support
Firebase  ✅Adapter coming soon 🎉 as well as Firebase Auth
Provider  ✅Not required! Configure in a few lines of code
Riverpod  ✅Not required! Configure in a few lines of code
get_it  ✅Not required! Configure in a few lines of code
BLoC  ✅Great support
Freezed  ✅Good support
Flutter Web  ✅Great support
Hive  ✅Flutter Data uses Hive internally for local storage
Chopper/RetrofitNot required: Flutter Data generates its own REST clients

📲 Apps using Flutter Data

The new offline-first Scout Flutter app is being developed in record time with Flutter Data.

➕ Questions and collaborating

Please use Github to ask questions, open issues and send PRs. Thanks!

You can also hit me up on Twitter @thefrank06

Tests can be run with: pub run test

📝 License

See LICENSE.

Libraries

data_library_builder
flutter_data
repository_builder
utils