flutter_data 2.0.0-rc1 copy "flutter_data: ^2.0.0-rc1" to clipboard
flutter_data: ^2.0.0-rc1 copied to clipboard

The seamless way to work with persistent data models in Flutter. Inspired by Ember Data and ActiveRecord.

Flutter Data

tests codecov pub-web.flutter-io.cn 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, 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, DataModels 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 #

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.

345
likes
0
pub points
86%
popularity

Publisher

verified publisherflutterdata.dev

The seamless way to work with persistent data models in Flutter. Inspired by Ember Data and ActiveRecord.

Repository (GitHub)
View/report issues

Documentation

Documentation

License

unknown (LICENSE)

Dependencies

analyzer, async, build, build_resolvers, collection, crypto, equatable, glob, hive, http, inflection3, json_annotation, meta, path, pubspec_parse, recase, riverpod, source_gen, source_helper, state_notifier, uuid

More

Packages that depend on flutter_data