Skip to content

Seamlessly manage persistent data in your Flutter apps

License

Notifications You must be signed in to change notification settings

CodeKoalas/flutter_data

 
 

Repository files navigation

Flutter Data

tests codecov pub.dev license

Persistent reactive models in Flutter with zero boilerplate

Flutter Data is an offline-first persistence framework that gives you a configurable REST client and powerful model relationships.

Heavily inspired by Ember Data and ActiveRecord


Features

  • Repositories for all models 🚀
  • Built for offline-first 🔌
    • Hive-based local storage at its core
    • Failure handling & retry API
  • Intuitive APIs, effortless setup 💙
    • Truly configurable and composable via Dart mixins and codegen
    • Built-in Riverpod providers for all models
  • Exceptional relationship support ⚡️
    • Automatically synchronized, fully traversable relationship graph
    • Reactive relationships

Check out the Documentation or the Tutorial 📚 where we build a TO-DO app from the ground up in record time.

Set up

See the quickstart guide for setup and boot configuration.

Prefer an example? Here's the Flutter Data sample setup app with support for Riverpod, Provider and get_it.

👩🏾‍💻 Usage

For a given User model annotated with @DataRepository:

@JsonSerializable()
@DataRepository([MyJSONServerAdapter])
class User with DataModel<User> {
  @override
  final int id; // ID can be of any type
  final String name;
  User({this.id, this.name});
  // `User.fromJson` and `toJson` optional
}

mixin MyJSONServerAdapter on RemoteAdapter<User> {
  @override
  String get baseUrl => "https://my-json-server.typicode.com/flutterdata/demo/";
}

After a code-gen build, Flutter Data will generate a Repository<User> and utilities such as watchUser:

@override
Widget build(BuildContext context) {
  final state = useProvider(watchUser(1).state);
  if (state.isLoading) {
    return Center(child: const CircularProgressIndicator());
  }
  final user = state.model;
  return Text(user.name);
}

watchUser(1) is a shortcut to repository.watchOne(1).

Let's see how to update the user:

GestureDetector(
  onTap: () =>
      context.read(usersRepositoryProvider).save(User(id: 1, name: 'Updated')),
  child: Text('Update')
),

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

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

In addition to the reactivity, DataModels get extensions and automatic relationships, ActiveRecord-style, so the above becomes:

GestureDetector(
  onTap: () =>
      User(id: 1, name: 'Updated').init(context.read).save(),
  child: Text('Update')
),

Some other examples:

final todo = await Todo(title: 'Finish docs').init(context.read).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 And pure Dart, too. Null-safety coming soon!
Flutter Web Supported!
json_serializable Fully supported (but not required)
Riverpod Supported & automatically wired up
Provider Supported with minimal extra code
get_it Supported with minimal extra code
Classic JSON REST API Built-in support!
JSON:API Supported via external adapter
Freezed Supported!

📲 Apps using Flutter Data

logos

➕ Questions and collaborating

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

On Twitter: @flutterdata

Tests can be run with: pub run test

📝 License

See LICENSE.

About

Seamlessly manage persistent data in your Flutter apps

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Dart 100.0%