flutter_data 1.3.0 flutter_data: ^1.3.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, required 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 userProvider
and ref.users.watchOne
(Riverpod only):
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.users.watchOne(1);
if (state.isLoading) {
return Center(child: const CircularProgressIndicator());
}
final user = state.model;
return Text(user.name);
}
ref.users.watchOne(1)
is a handy shortcut to the userProvider
which provides ref.watch(usersRepositoryProvider).watchOneNotifier(1)
.
Let's see how to update the user:
TextButton(
onPressed: () => ref.users.save(User(id: 1, name: 'Updated')),
child: Text('Update'),
),
ref.users.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.
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(ref.read).save(),
child: Text('Update')
),
Some other examples:
final todo = await Todo(title: 'Finish docs').init(ref.read).save();
// or its equivalent:
final todo = await ref.todos.save(Todo(title: 'Finish docs'));
// POST https://my-json-server.typicode.com/flutterdata/demo/todos/
print(todo.id); // 201
final user = await repository.findOne(1, params: { '_embed': 'todos' });
// (remember repository can be accessed via ref.users)
// GET https://my-json-server.typicode.com/flutterdata/demo/users/1?_embed=todos
print(user.todos.length); // 20
await user.todos.last.delete();
Explore the Documentation.
Fully functional app built with Flutter Data? See the code for the finished Flutter Data Tasks App.
Compatibility #
Fully compatible with the tools we know and love:
Flutter | ✅ | And pure Dart, too. |
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!
On Twitter: @flutterdata
Tests can be run with: pub run test
📝 License #
See LICENSE.