flutter_data 0.7.0 flutter_data: ^0.7.0 copied to clipboard
The seamless way to work with persistent data models in Flutter. Inspired by Ember Data and ActiveRecord.
Flutter Data
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 🚀
- CRUD and custom remote endpoints
- StateNotifier watcher APIs
- 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, DataModel
s 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 #
➕ 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.