flutterdata / Flutter_data
Programming Languages
Flutter Data
Flutter Data is the seamless way to work with persistent data models in Flutter.
Inspired by Ember Data and ActiveRecord.
⚠️ DOCUMENTATION IS OUT OF DATE. I'm working on it, please bare with me!
Refer to https://github.com/flutterdata/flutter_data_setup_app and https://github.com/flutterdata/flutter_data_todos
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
andget_it
- Convention over configuration powered by Dart mixins
- Automatically pre-configured for
-
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 ofint
,String
, etc -
User.fromJson
andtoJson
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, _) {
//model could be available from local storage and could be used in the meantime
if (state.isLoading && !state.hasModel) {
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.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 | ✅ | 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/Retrofit | Not 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.